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

时间:2011-11-01 16:56:23

标签: python

globals()locals()vars()之间有什么区别?他们回报了什么?结果更新是否有用?

1 个答案:

答案 0 :(得分:151)

每个都返回一个字典:

  • globals() 始终返回模块命名空间的字典
  • locals() 始终返回当前命名空间的 字典
  • vars()返回当前命名空间的字典(如果没有参数调用)或参数的字典。

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

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

两个注释:

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

    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