什么是模块变量与全局变量?

时间:2017-09-03 12:15:33

标签: python module namespaces global-variables

来自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()的一部分?

2 个答案:

答案 0 :(得分:3)

Python中基本上有3种不同的范围:

  • 模块范围(保存模块中的属性__dict__
  • 类/实例范围(保存类或实例__dict__中的属性)
  • 功能范围

(也许我忘了那里......)

这些工作几乎相同,只是类范围可以动态使用__getattr____getattribute__来模拟实际上不存在的变量的存在。函数是不同的,因为你可以传递变量(使它们成为其范围的一部分)并从函数中返回它们。

然而,当你谈论全球(和本地范围)时,你必须从可见性的角度来考虑它。没有全局范围(除了像intzip之类的Pythons内置函数之外,还有一个全局模块范围。这表示您可以在模块中访问的所有内容。

因此,在文件的开头,这个“粗略”表示模块范围:

enter image description here

然后您import my_module as m表示m现在是对my_module的引用,此引用位于当前文件的全局范围内。这意味着'm' in globals()将为True。

enter image description here

您还定义foo=1,使foo成为全球范围的一部分,'foo' in globals()Truefoo但是,此m.foom.bar = m.foo + 1完全不同!

enter image description here

然后,您m访问全局变量bar并根据m属性{{1}更改 属性foo }。这不会使m s foobar成为当前全球范围的一部分。它们仍然位于my_module的全球范围内,但您可以通过全局变量my_module访问m全局范围。

enter image description here

我在这里用AB缩写了模块名称,但我希望它仍然可以理解。

答案 1 :(得分:-1)

全局变量是您可以在任何给定时间使用变量的地方,即使在函数或for循环中也是如此。本地化变量在函数中定义,但不返回。