在Python中 globals(),locals()和vars()之间有什么区别?


在Python中 globals(),locals()和vars()之间有什么区别?

每个都返回一个字典:

  • globals() 始终返回模块名称空间的字典
  • locals() 始终返回当前命名空间的字典
  • vars()返回任一当前命名空间的字典(如果调用无参数)或所述参数的字典。

locals并vars可以使用更多的解释。如果locals()被调用的函数内部它构造函数的命名空间的字典的那一刻,并返回它-任何进一步名称分配都不会反映在返回的字典,任何分配到字典中都不会反映在实际本地命名空间:

def test():
    a = 1
    b = 2
    huh = locals()
    c = 3
    print(huh)
    huh['d'] = 4
    print(d)

给我们:

{'a': 1, 'b': 2}
Traceback (most recent call last):
  File "test.py", line 30, in <module>
    test()
  File "test.py", line 26, in test
    print(d)
NameError: global name 'd' is not defined

两个说明:

此行为是CPython特定的 - 其他Pythons可能允许更新使其返回到本地名称空间 在CPython 2.x中,可以通过exec "pass"在函数中添加一行来完成这项工作。 如果locals()被称为外函数返回实际的字典,它是当前的命名空间。命名空间进一步的变化被反映在字典中,并到词典中的变化被反映在名称空间:

class Test(object):
    a = 'one'
    b = 'two'
    huh = locals()
    c = 'three'
    huh['d'] = 'four'
    print huh

给我们:

{
  'a': 'one',
  'b': 'two',
  'c': 'three',
  'd': 'four',
  'huh': {...},
  '__module__': '__main__',
}

到目前为止,我所说的一切locals()也是如此vars()......这就是区别: vars()接受一个对象作为其参数,如果你给它一个对象,它就会返回该dict对象的对象。如果该对象不是函数,则dict返回的是该对象的命名空间:

class Test(object):
    a = 'one'
    b = 'two'
    def frobber(self):
        print self.c
t = Test()
huh = vars(t)
huh['c'] = 'three'
t.frobber()

输出:

three

如果对象是一个函数,你仍然会得到它dict,但除非你做有趣和有趣的东西,它可能不是很有用:

def test():
    a = 1
    b = 2
    print test.c
huh = vars(test)       # these two lines are the same as 'test.c = 3'
huh['c'] = 3
test()

输出:

3