globals(),locals()和vars()之间有什么区别?
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"
在函数中添加一个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