Когда в Python функции используется переменная, которая не была явно объявлена как глобальная с помощью ключевого слова `global`, Python следует определенным правилам для определения области видимости этой переменной:
1.
Поиск в локальной области видимости: Сначала Python ищет переменную в локальной области видимости функции. Это включает в себя любые переменные, которые были явно определены внутри функции (например, `x = 5` или переменные, переданные в качестве аргументов функции).
2.
Чтение переменной (без присваивания): Если переменная используется только для чтения (например, `print(x)`), и она не найдена в локальной области видимости, Python продолжит поиск во включающих областях видимости, таких как область видимости внешней функции (если функция вложена в другую функцию) и, наконец, в глобальной области видимости модуля. Если переменная не найдена нигде, возникнет ошибка `NameError`.
3.
Присваивание переменной (=): Если переменной присваивается значение (например, `x = 10`), и она не была объявлена как `global`, Python предполагает, что это новая локальная переменная. Это означает, что Python создаст новую переменную с таким именем в локальной области видимости функции. Если переменная с таким же именем существует в глобальной области видимости, ее значение останется неизменным, и локальная переменная с тем же именем скроет глобальную переменную внутри функции.
4.
Модификация (+=, -=, *= и т.д.): Если переменная модифицируется (например, `x += 1`), и она не была объявлена как `global`, и ее нет в локальной области видимости, Python также предположит, что это новая локальная переменная. Но, в отличие от простого присваивания, Python не может создать локальную переменную, не зная ее начального значения. Поэтому, в данном случае, возникнет ошибка `UnboundLocalError: local variable 'x' referenced before assignment`. Это происходит потому, что Python пытается использовать значение переменной перед тем, как оно было присвоено в локальной области видимости.
Пример:
x = 5 # Глобальная переменная
def my_function():
print(x) # Чтение глобальной переменной x (выведет 5)
x = 10 # Создает локальную переменную x, не изменяет глобальную
print(x) # Выведет 10 (локальную x)
# x += 1 # UnboundLocalError
my_function()
print(x) # Выведет 5 (глобальную x)
Чтобы изменить глобальную переменную внутри функции, нужно использовать ключевое слово `global`:
x = 5
def my_function():
global x
print(x) # Выведет 5 (глобальную x)
x = 10 # Изменяет глобальную переменную x
print(x) # Выведет 10 (глобальную x)
my_function()
print(x) # Выведет 10 (глобальную x)