在 Python 3 中,由于作用域的原因,不允许从类定义中的列表推导式访问类变量限制。类范围不被视为列表理解中使用的变量的有效查找范围。
class Foo: x = 5 y = [x for i in range(1)]
此代码将引发 NameError: name 'x' is not Defined在 Python 3 中。
Python 遵循严格的作用域规则,并且类作用域与函数、循环和推导式的作用域是分开的。推导式始终在其自己的作用域内执行,其中包括推导式本身内声明的任何变量。
在 Python 2 中,这不是问题,因为列表推导式是使用允许访问封闭类作用域的快捷方式实现的。然而,这种行为被认为是不一致的,并在 Python 3 中进行了更改以强制执行适当的范围。
虽然列表推导式的最内层可迭代无法访问类变量,最外面的可迭代表达式可以。这是因为最外面的可迭代对象是在周围范围内求值的:
class Foo: x = 5 y = [i for i in range(x)] # This works fine
显式函数:
在可以访问类变量并使用列表的类理解:
class Foo: x = 5 def get_y(self): return self.x, [x for i in range(self.x)]
实例变量:
使用列表理解在构造函数中初始化实例变量:
class Foo: def __init__(self): self.y = [self.x for i in range(1)]
全局变量:
声明变量在类之外并在列表理解中使用它:
x = 5 class Foo: y = [x for i in range(1)]
以上是为什么我无法在类定义中的 Python 3 列表推导式中直接访问类变量?的详细内容。更多信息请关注PHP中文网其他相关文章!