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