从类定义中的列表理解中访问类变量如何从类定义中的列表理解中访问其他类变量?以下内容在Python 2中有效,但在Python 3中失败:class Foo:
x = 5
y = [x for i in range(1)]Python 3.2给出了错误:NameError: global name 'x' is not defined试着Foo.x也不起作用。对于如何在Python 3中做到这一点,有什么想法吗?一个稍微复杂一些的激励例子:from collections import namedtupleclass StateDatabase:
State = namedtuple('State', ['name', 'capital'])
db = [State(*args) for args in [
['Alabama', 'Montgomery'],
['Alaska', 'Juneau'],
# ...
]]在这个例子中,apply()这本来是一个不错的解决办法,但不幸的是,它已经从Python 3中删除了。
4 回答
![?](http://img1.sycdn.imooc.com/5458655200013d9802200220-100-100.jpg)
料青山看我应如是
TA贡献1772条经验 获得超8个赞
NameError: name 'x' is not defined
class A: x = 4 y = [x+i for i in range(1)]
A.x
class A: x = 4 y = (lambda x=x: [x+i for i in range(1)])()
![?](http://img1.sycdn.imooc.com/54586870000183e302200220-100-100.jpg)
牧羊人nacy
TA贡献1862条经验 获得超7个赞
这是Python中的一个bug。理解被宣传为等价于for循环,但在类中并非如此。至少在Python3.6.6中,在类中使用的理解中,只有一个外部变量可以在理解中访问,并且必须使用它作为最外层的迭代器。在函数中,此范围限制不适用。
为了说明为什么这是一个bug,让我们回到原来的例子。这是失败的:
class Foo: x = 5 y = [x for i in range(1)]
但这是可行的:
def Foo(): x = 5 y = [x for i in range(1)]
该限制在.的结尾处作了说明。
添加回答
举报
0/150
提交
取消