我试图理解Python代码何时引用模块级变量和类级变量.我在模块中有以下代码,main.py
'
## main.py # global variable x x = "I am global and I love it!" class SomeClass: x = "I am a class attribute, and life is good!" print(x) # prints "I am a class attribute, and life is good!" def __init__(self): print(x) # prints "I am global and I love it!" Why? print(x) # prints "I am global and I love it!" SomeClass()
导入此模块时,输出为:
I am a class attribute, and life is good! I am global and I love it! I am global and I love it!
为什么SomeClass.__init__
方法内的print会打印全局变量,而类body中的print会打印class属性x
?
这是从Python邮件列表上的一个问题中解释的:https://mail.python.org/pipermail/python-list/2015-December/701167.html
Python中的类定义创建了一个名称空间,但它们并没有创建新的作用域.这意味着在类中定义的函数不能直接访问包含类的变量.相反,他们必须将它们作为类或实例的属性进行访问.
因此,您可以使用或获取类变量,而不是访问x
示例的__init__
函数.SomeClass.x
self.x
print(x)
在类体中工作的原因是该代码以类命名空间作为其本地命名空间运行.如果您尝试在类级别执行更复杂的操作,可能会遇到许多问题,因为无范围命名空间是一个相当奇怪的环境.例如,这不起作用:
class Foo: x = 1 dct = {i: x for i in range(10)}
您将获得NameError
有关x
变量的信息,因为字典理解在其自己的范围内运行,并且无法查看x
在无范围类命名空间中定义的类变量.