Каждый из них возвращает словарь:
globals()
всегда возвращает словарь модуля *1008* пространства имен locals()
всегда возвращает a словарь текущего пространства имен 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 - другие питоны могут разрешить обновлениям возвращаться в локальное пространство имен
- В CPython 2.x это можно сделать, поставив строку
exec "pass"
в функции.
Если вызывается *1053* за пределами , функция возвращает фактический словарь, который является текущим пространством имен.Дальнейшие изменения в пространстве имен отражаются в словаре , а изменения в словаре отражаются в пространстве имен :
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