Python

Python def функция

 def tea(): 
def do_local():
spam = "local"

def do_nonlocal():
nonlocal spam
spam = "Nonlocal"

def do_global():
global spam
spam = "Global"
spam = "test"
do_local()
print("What you know about rouling: ", spam)
do_nonlocal()
print("SDFDSFDSFDSF: ", spam)
do_global()
print("html izi i nedostoin oplati: ", spam)
tea()
Почему в 3-ем принте выводится Nonlocal?
Emin Amirov
Emin Amirov
875
В функции tea в начале функции значение переменной spam устанавливается в "test". Затем вызывается функция do_local, которая определяет локальную переменную spam и устанавливает ее в значение "local". Однако эта локальная переменная видна только в функции do_local и никак не влияет на значение spam в функции tea.

Далее вызывается функция do_nonlocal. Эта функция объявляет переменную spam нелокальной, что означает, что она является переменной, определенной в объемлющей области видимости (в данном случае в функции tea). Затем функция do_nonlocal присваивает значение "Nonlocal" нелокальной переменной spam. Это присвоение влияет на значение spam в функции tea, поэтому при выполнении строки print("SDFDSFDSFDSF: ", spam) будет выведено значение "Nonlocal".

Наконец, вызывается функция do_global. Эта функция объявляет переменную spam глобальной, что означает, что она определена в глобальной (т.е. верхнеуровневой) области видимости. Затем функция do_global присваивает глобальной переменной spam значение "Global". Это присвоение не влияет на значение spam в функции tea, поскольку переменная spam в функции tea является нелокальной, а не глобальной. Поэтому при выполнении строки print("html izi i nedostoin oplati: ", spam) снова выводится значение "Nonlocal".
Влад Бирюков
Влад Бирюков
1 043
Лучший ответ
Использование global означает, что spam - глобальная переменная, о которой tea знать не знает.

Внутри do_global ты создаёшь глобальную переменную spam и присваиваешь ей значение "Global". Тогда как существующая внутри tea локальная переменная spam никак при этом не меняется.

"Простой" язык Python - это большое поле, густо усыпанное граблями.
Anuar Duzelbaev
Anuar Duzelbaev
86 087