如何从类定义中的列表推导中访问其他类变量?以下适用于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中删除.
我正在为一个类的项目工作,我的代码没有产生与参考代码相同的结果.
我将我的代码与参考代码逐行比较,它们看起来几乎完全相同.一切似乎在逻辑上等同.最终我开始更换线和测试,直到找到重要的线.
原来它是这样的(编辑:确切代码更低):
# 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 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)