... animal = 'wombat'
... print('inside change_local:', animal, id(animal))
...
>>> change_local()
inside change_local: wombat 4330406160
>>> animal
'fruitbat'
>>> id(animal)
4330390832
Что здесь произошло? В первой строке мы присвоили строку 'fruitbat' гло-
бальной переменной с именем animal. Функция change_local() также имеет пере-
менную с именем animal, но она находится в ее локальном пространстве имен.
Мы использовали функцию id(), чтобы вывести на экран уникальное значение
каждого объекта и доказать, что переменная animal, расположенная внутри функции
change_local(), — это не переменная animal, расположенная на основном уровне
программы.
136
Глава 4. Корочка Python: структуры кода
Чтобы получить доступ к глобальной переменной вместо локальной переменной
внутри функции, вам нужно явно использовать ключевое слово global (вы знали,
что я это скажу: явное лучше неявного):
>>> animal = 'fruitbat'
>>> def change_and_print_global():
... global animal
... animal = 'wombat'
... print('inside change_and_print_global:', animal)
...
>>> animal
'fruitbat'
>>> change_and_print_global()
inside change_and_print_global: wombat
>>> animal
'wombat'
Если вы не используете ключевое слово global внутри функции, Python задей-
ствует локальное пространство имен и переменная будет локальной. Она пропадет
после того, как функция завершит работу.
Python предоставляет две функции для доступа к содержимому ваших про-
странств имен:
locals() — возвращает словарь, содержащий имена локального пространства имен;
globals() — возвращает словарь, содержащий имена глобального пространства имен.
Вот так они используются:
>>> animal = 'fruitbat'
>>> def change_local():
... animal = 'wombat' # локальная переменная
... print('locals:', locals())
...
>>> animal
'fruitbat'
>>> change_local()