来自a comment:“Python中的全局基本上意味着在模块级别”。但是,在名为my_module.py
的文件中运行此代码:
import my_module as m
foo = 1
m.bar = m.foo + 1
if __name__ == "__main__":
print('foo:', foo)
print('m.foo:', m.foo)
print('m.bar:', m.bar, '\n')
for attrib in ('foo', 'bar'):
print("'{0}' in m.__dict__: {1}, '{0}' in globals(): {2}".format(
attrib,
attrib in m.__dict__,
attrib in globals()))
输出:
foo: 1
m.foo: 1
m.bar: 2
'foo' in m.__dict__: True, 'foo' in globals(): True
'bar' in m.__dict__: True, 'bar' in globals(): False
模块和全局命名空间究竟是什么?
为什么模块命名空间中有__dict__
属性,但全局命名空间中没有?
为什么m.bar
成为__dict__
的一部分,而不是globals()
的一部分?
答案 0 :(得分:3)
Python中基本上有3种不同的种范围:
__dict__
)__dict__
中的属性)(也许我忘了那里......)
这些工作几乎相同,只是类范围可以动态使用__getattr__
或__getattribute__
来模拟实际上不存在的变量的存在。函数是不同的,因为你可以传递变量(使它们成为其范围的一部分)并从函数中返回它们。
然而,当你谈论全球(和本地范围)时,你必须从可见性的角度来考虑它。没有全局范围(除了像int
,zip
之类的Pythons内置函数之外,还有一个全局模块范围。这表示您可以在模块中访问的所有内容。
因此,在文件的开头,这个“粗略”表示模块范围:
然后您import my_module as m
表示m
现在是对my_module
的引用,此引用位于当前文件的全局范围内。这意味着'm' in globals()
将为True。
您还定义foo=1
,使foo
成为全球范围的一部分,'foo' in globals()
将True
。foo
但是,此m.foo
与m.bar = m.foo + 1
完全不同!
然后,您m
访问全局变量bar
并根据m
属性{{1}更改 属性foo
}。这不会使m
s foo
和bar
成为当前全球范围的一部分。它们仍然位于my_module
的全球范围内,但您可以通过全局变量my_module
访问m
全局范围。
我在这里用A
和B
缩写了模块名称,但我希望它仍然可以理解。
答案 1 :(得分:-1)
全局变量是您可以在任何给定时间使用变量的地方,即使在函数或for循环中也是如此。本地化变量在函数中定义,但不返回。