потому что вы пытаетесь переназначить то же имя переменной, чтобы python теперь рассматривал z как локальную область видимости, поскольку она была изменена внутри функции без объявления ее глобальной. Вы можете использовать dis
, чтобы увидеть, что здесь происходит под капотом. В func1 вы можете видеть, что z
загружается из global, но во втором функционале из-за синтаксиса он думает, что вы ссылаетесь на локальное значение z, поэтому оно загружается из локальной области видимости, где z не существует.
myGlobal = 5
z=2
def func1(a):
a=z+1
def func2(a):
z=z+1 # here it throws any error stating local variable is not defined
from dis import dis
print(dis(func1))
print("###")
print(dis(func2))
ВЫХОД
5 0 LOAD_GLOBAL 0 (z)
2 LOAD_CONST 1 (1)
4 BINARY_ADD
6 STORE_FAST 0 (a)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
None
###
9 0 LOAD_FAST 1 (z)
2 LOAD_CONST 1 (1)
4 BINARY_ADD
6 STORE_FAST 1 (z)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
None