В чем разница между globals (), locals () и vars ()? - PullRequest
127 голосов
/ 01 ноября 2011

В чем разница между globals(), locals() и vars()? Что они возвращают? Полезны ли обновления результатов?

1 Ответ

156 голосов
/ 01 ноября 2011

Каждый из них возвращает словарь:

  • 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

Два примечания:

  1. Это поведение специфично для CPython - другие питоны могут разрешить обновлениям возвращаться в локальное пространство имен
  2. В 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...