相关疑难解决方法(0)

从类定义中的列表推导中访问类变量

如何从类定义中的列表推导中访问其他类变量?以下适用于Python 2但在Python 3中失败:

class Foo:
    x = 5
    y = [x for i in range(1)]
Run Code Online (Sandbox Code Playgroud)

Python 3.2给出了错误:

NameError: global name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)

尝试Foo.x也不起作用.有关如何在Python 3中执行此操作的任何想法?

一个稍微复杂的激励示例:

from collections import namedtuple
class StateDatabase:
    State = namedtuple('State', ['name', 'capital'])
    db = [State(*args) for args in [
        ['Alabama', 'Montgomery'],
        ['Alaska', 'Juneau'],
        # ...
    ]]
Run Code Online (Sandbox Code Playgroud)

在这个例子中,apply()本来是一个不错的解决方法,但它遗憾地从Python 3中删除.

python scope list-comprehension python-3.x python-internals

152
推荐指数
3
解决办法
2万
查看次数

max([x代表某事物的x])vs max(x代表某事物的x):为什么会有差异,它是什么?

我正在为一个类的项目工作,我的代码没有产生与参考代码相同的结果.

我将我的代码与参考代码逐行比较,它们看起来几乎完全相同.一切似乎在逻辑上等同.最终我开始更换线和测试,直到找到重要的线.

原来它是这样的(编辑:确切代码更低):

# my version:
max_q = max([x for x in self.getQValues(state)])

# reference version which worked:
max_q = max(x for x in self.getQValues(state))
Run Code Online (Sandbox Code Playgroud)

现在,这让我感到困惑.我尝试使用Python(2.7)解释器进行一些实验,使用max带有和不带方括号的列表推导运行测试.结果似乎完全一样.

即使通过PyCharm进行调试,我也没有理由认为我的版本没有产生与参考版本完全相同的结果.到目前为止,我认为我对列表理解的工作方式(以及max()函数的工作方式)有很好的处理,但现在我不太确定,因为这是一个如此奇怪的差异.

这里发生了什么?为什么我的代码产生的结果与参考代码不同(在2.7中)?没有括号的理解中的传递与传递括号的理解有何不同?

编辑2:确切的代码是这样的:

# works
max_q = max(self.getQValue(nextState, action) for action in legal_actions)

# doesn't work (i.e., provides different results)
max_q = max([self.getQValue(nextState, action) for action in legal_actions])
Run Code Online (Sandbox Code Playgroud)

我不认为这应该被标记为重复 - 是的,另一个问题是关于理解对象和列表对象之间的区别,但是max()当给出"由X理解构建的一些列表"时,为什么会提供不同的结果,而不是' X理解'独自一人.

python list-comprehension python-2.7

16
推荐指数
2
解决办法
972
查看次数

为什么这个python代码表现出奇怪的范围规则

我正在运行Python 2.7.8(Anaconda Distribution),这段代码失败了.这看起来像Python实现中的一个错误,但我错过了什么?

class C:
    x = {2 : 1}
    y = {w for w in x if x[w]==1}
Run Code Online (Sandbox Code Playgroud)

运行此代码会出现以下错误消息:

NameError:未定义全局名称"x"

错误信息对我来说似乎也是错误的.

请注意,以下两个非常相似的代码片段可以正常工作:

# this works fine:
class C:
    x = {2 : 1}
    y = [w for w in x if x[w]==1]


# this works fine too:
x = {2 : 1}
y = {w for w in x if x[w]==1}
Run Code Online (Sandbox Code Playgroud)

python list-comprehension scoping dictionary-comprehension

12
推荐指数
0
解决办法
145
查看次数