猿问

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

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

如何从类定义中的列表理解中访问其他类变量?以下内容在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中删除了。


GCT1015
浏览 565回答 4
4回答

料青山看我应如是

在我看来,这是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)])()由于语法非常糟糕,所以我通常只初始化构造函数中的所有类变量。

牧羊人nacy

这是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)]该限制在.的结尾处作了说明。
随时随地看视频慕课网APP

相关分类

Python
我要回答