为了账号安全,请及时绑定邮箱和手机立即绑定

从类定义中的列表理解中访问类变量

从类定义中的列表理解中访问类变量

GCT1015 2019-05-31 10:52:47
从类定义中的列表理解中访问类变量如何从类定义中的列表理解中访问其他类变量?以下内容在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 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

在我看来,这是Python 3中的一个缺陷。我希望他们能改变。

旧方式(2.7工作,投掷)NameError: name 'x' is not defined(3+):

class A:
    x = 4
    y = [x+i for i in range(1)]

注意:只需用A.x解决不了

新方法(工作在3+中):

class A:
    x = 4
    y = (lambda x=x: [x+i for i in range(1)])()

由于语法非常糟糕,所以我通常只初始化构造函数中的所有类变量。


查看完整回答
反对 回复 2019-05-31
?
牧羊人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)]

该限制在.的结尾处作了说明。


查看完整回答
反对 回复 2019-05-31
  • 4 回答
  • 0 关注
  • 564 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信