首页 > 后端开发 > Python教程 > 为什么我无法在类定义中的 Python 3 列表推导式中直接访问类变量?

为什么我无法在类定义中的 Python 3 列表推导式中直接访问类变量?

Susan Sarandon
发布: 2024-12-27 13:59:14
原创
992 人浏览过

Why Can't I Access Class Variables Directly in Python 3 List Comprehensions Within a Class Definition?

从类定义中的列表推导式访问类变量

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板