首页 >后端开发 >Python教程 >为什么 Python 3 列表推导式不能直接访问类变量?

为什么 Python 3 列表推导式不能直接访问类变量?

Linda Hamilton
Linda Hamilton原创
2024-12-23 22:51:10854浏览

Why Can't Python 3 List Comprehensions Directly Access Class Variables?

从列表推导式访问类变量

在 Python 3 中,列表推导式无法直接访问类定义中定义的类变量,因为它们在自己的嵌套范围内操作。此行为与 Python 2 不同,在 Python 2 中可以进行此类访问。

错误示例

以下代码演示了 Python 3 中的问题:

class Foo:
    x = 5
    y = [x for i in range(1)]

此代码将引发x 的 NameError,因为列表推导式无法访问类变量。

类作用域和 List/Set/Dict推导式

列表推导式、集合推导式和字典推导式以及生成器表达式在不继承自类作用域的嵌套作用域中运行。这是因为此类推导式是作为函数实现的,并在单独的作用域中运行。

解决方法

尽管存在限制,但还是有一些解决方法可以从推导式访问类变量:

1 。显式作用域

在类定义中创建特定作用域来保存推导式所需的变量:

class Foo:
    x = 5
    def __init__(self):
        y = [self.x for i in range(1)]

2.实例变量

使用实例变量,通过在构造函数中初始化它们:

class Foo:
    def __init__(self):
        self.x = 5
        self.y = [self.x for i in range(1)]

3.全局作用域

如果可能,将变量和逻辑移到类定义之外并使用全局作用域:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn