[英]Python: What is the difference between a global variable, vs. a variable with the prefix “self.”, vs. a local variable?
[英]What is a module variable vs. a global variable?
来自评论 :“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()
一部分?
Python中基本上有3 种不同的范围:
__dict__
) __dict__
中的属性) (也许我忘了那里......)
这些工作几乎相同,只是类范围可以动态使用__getattr__
或__getattribute__
来模拟实际上不存在的变量的存在。 函数是不同的,因为您可以传递变量(使它们成为其范围的一部分)并从函数返回它们。
但是,当您谈论全局(和本地范围)时,您必须从可见性的角度来考虑它。 没有全局范围 (除了像Pythons内置插件,如int
, zip
等),只有一个全局模块范围 。 这表示您可以在模块中访问的所有内容。
因此,在文件的开头,这个“粗略”表示模块范围:
然后import my_module as m
,这意味着m
now现在是对my_module
的引用,并且此引用位于当前文件的全局范围内。 这意味着'm' in globals()
将为True。
你还定义了foo=1
,它使foo
成为全局范围的一部分,而'foo' in globals()
将为True
。 然而,这个foo
是与m.foo
完全不同的实体!
然后你做m.bar = m.foo + 1
访问全局变量m
并根据m
s属性foo
更改其属性bar
。 这不会让m
小号foo
和bar
目前全球范围的一部分。 它们仍然在my_module
的全局范围内,但您可以通过全局变量m
访问my_module
的全局范围。
我在这里用A
和B
缩写了模块名称,但我希望它仍然可以理解。
全局变量是您可以在任何给定时间使用变量的地方,即使在函数或for循环中也是如此。 本地化变量在函数中定义,但不返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.