当前位置:  开发笔记 > 编程语言 > 正文

为什么Python打印这个全局变量而不是类属性?

如何解决《为什么Python打印这个全局变量而不是类属性?》经验,为你挑选了1个好方法。

我试图理解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



1> Blckknght..:

Python中的类定义创建了一个名称空间,但它们并没有创建新的作用域.这意味着在类中定义的函数不能直接访问包含类的变量.相反,他们必须将它们作为类或实例的属性进行访问.

因此,您可以使用或获取类变量,而不是访问x示例的__init__函数.SomeClass.xself.x

print(x)在类体中工作的原因是该代码以类命名空间作为其本地命名空间运行.如果您尝试在类级别执行更复杂的操作,可能会遇到许多问题,因为无范围命名空间是一个相当奇怪的环境.例如,这不起作用:

class Foo:
    x = 1
    dct = {i: x for i in range(10)}

您将获得NameError有关x变量的信息,因为字典理解在其自己的范围内运行,并且无法查看x在无范围类命名空间中定义的类变量.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有