globals()
,locals()
和vars()
之间有什么区别?他们回报了什么?结果更新是否有用?
答案 0 :(得分:151)
每个都返回一个字典:
globals()
始终返回模块命名空间的字典locals()
始终返回当前命名空间的 字典vars()
返回当前命名空间的字典(如果没有参数调用)或参数的字典。 locals
和vars
可以使用更多解释。如果在函数内部调用了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
两个注释:
exec "pass"
行来完成此工作。如果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