locals () против глобальных () в функции - PullRequest
0 голосов
/ 27 октября 2019

В следующей функции:

def info(self):
    a = 4
    def _inner():
        b = 5
        print ('LOCALS',locals())
        print ('GLOBALS', globals())
    _inner()

В python3.6 печатается следующее:

LOCALS {'b': 5}
GLOBALS {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'info': <function info at 0x1029d3598>}

Почему не a, свободная переменная, включенная в_inner locals()? Из документов написано:

locals ()

Обновить и вернуть словарь, представляющий текущую локальную таблицу символов. Свободные переменные возвращаются locals() при вызове в функциональных блоках, но не в блоках класса .

Кроме того, всегда ли переменные класса скрыты от locals()? Например:

class X:
    b = 2
    def info(self):
        a = 3
        print (locals())

>>> X().info()
{'a': 3, 'self': <__main__.X object at 0x102aa6518>}

1 Ответ

2 голосов
/ 27 октября 2019

Возвращаются свободные переменные, документы не ошибаются ... но свободная переменная существует только для внутренней функции, если она используется в ней. В противном случае он не загружается в локальную область. Попробуйте добавить простой b += a сразу после b = 5, и вы увидите, что напечатано LOCALS {'b': 9, 'a': 4}, так, как вы ожидали.

Что касается переменных класса (и экземпляра), то вышеописанное применимо все равно, но с одной оговоркой: эти переменные должны быть доступны через объект self (или cls), и это то, что будет отображаться в locals().

...