Это просто очень распространенный вопрос для Python. Ниже мой ответ где-то еще.
global
и nonlocal
очень странные вещи, когда я был новичком.
Подумайте только: зачем они нужны в Python?
Это потому, что нам не нужны var
, let
и подобные вещи для объявления переменных.
Подумайте о Javascript
, это тоже динамический язык сценариев и очень похожий на python, но для объявления переменных ему нужно var
или let
или const
.
Самая важная вещь для объявления переменных - это определение области видимости.
Итак, в Python наши переменные имеют неявную область видимости по умолчанию: текущую область видимости, в которой они определены, и если мы хотим изменить область видимости некоторых переменных, нам нужно явно использовать global
или nonlocal
.
Все имена в левой части =
означают определение переменных.
Перед выполнением кода некоторой определенной области, Python предварительно вычислит все local variables
, которые находятся в левой части =
. Вот почему вы получили UnboundLocalError: local variable 'X' referenced before assignment
в:
def foo():
X = X + 10
Итак, если мы посмотрим эти имена не в определенной текущей области, просто
следуйте правилам цепочки прицелов: вверх, вверх, вверх и до built_in
.
Помните : область любого имени в левой части =
является текущей областью по умолчанию, и вы должны назначить ее (связать с ней что-то) перед ссылкой на нее.
Глобальная и локальная область видимости в Python - переполнение стека