在 Python 3 中,列表推导式无法直接访问类定义中定义的类变量,因为它们在自己的嵌套范围内操作。此行为与 Python 2 不同,在 Python 2 中可以进行此类访问。
以下代码演示了 Python 3 中的问题:
class Foo: x = 5 y = [x for i in range(1)]
此代码将引发x 的 NameError,因为列表推导式无法访问类变量。
列表推导式、集合推导式和字典推导式以及生成器表达式在不继承自类作用域的嵌套作用域中运行。这是因为此类推导式是作为函数实现的,并在单独的作用域中运行。
尽管存在限制,但还是有一些解决方法可以从推导式访问类变量:
在类定义中创建特定作用域来保存推导式所需的变量:
class Foo: x = 5 def __init__(self): y = [self.x for i in range(1)]
使用实例变量,通过在构造函数中初始化它们:
class Foo: def __init__(self): self.x = 5 self.y = [self.x for i in range(1)]
如果可能,将变量和逻辑移到类定义之外并使用全局作用域:
x = 5 class Foo: y = [x for i in range(1)]
直接访问类变量时在理解中是不可能的,最外面的可迭代有一个例外。确定最外层可迭代的表达式可以访问类变量:
class Foo: x = 5 y = [i for i in range(x)]
以上是为什么 Python 3 列表推导式不能直接访问类变量?的详细内容。更多信息请关注PHP中文网其他相关文章!