在 Python 2 中,可以从类定义中的列表推导式访问类变量。但是,在 Python 3 及更高版本中,由于范围限制,这是不允许的。类作用域与推导式和其他函数的作用域分开处理,因此,不允许使用名称从推导式中访问类变量。
例如,Python 2 中的以下代码可以工作:
class Foo: x = 5 y = [x for i in range(1)]
但是,在Python 3中,会导致错误:
NameError: name 'x' is not defined
此限制的原因是由于 Python 处理范围的方式。当评估类定义中的列表推导式时,Python 会为该推导式创建一个新的作用域。这个新作用域不包括类作用域,因此类作用域中定义的任何变量在推导式中都是不可见的。
推导式、生成器表达式和 lambda 函数都有自己的隔离作用域,这意味着它们不能直接从封闭函数或类范围访问变量。这是一项安全措施,可防止意外修改封闭范围内的变量。
此限制有一些解决方法:
class Foo: x = 5 def get_y(self, x): return [x for i in range(1)] y = get_y(x)
class Foo: x = 5 def get_y(): nonlocal x return [x for i in range(1)] y = get_y()
class Foo: def __init__(self): self.y = [self.x for i in range(1)]
class Foo: x = 5 @classmethod def get_y(cls): y = [cls.x for i in range(1)] return y Foo.y = Foo.get_y()
需要注意的是,虽然这些解决方法允许您从推导式中访问类变量,但它们确实会给您的代码带来额外的复杂性。仔细考虑哪种方法最适合您的特定需求。
以上是为什么我不能直接从 Python 3 中的列表推导式访问类变量?的详细内容。更多信息请关注PHP中文网其他相关文章!