Я проверял, как глобальное ключевое слово работает для проекта, когда я по ошибке запускаю CODE1, который работал так, как я не ожидал. Ключевое слово global вступает в силу в функции, даже если оно не находится в исполняемой части (т. Е. В if, если условие не выполняется).
Я искал вопросы о глобальном ключевом слове в python, но яне смог найти ответ на это. Я видел: Глобальное поведение ключевых слов Python , Глобальное ключевое слово в Python , Использование глобальных переменных в функции
Самое интересное, и я думаю,возможно, с этим нужно что-то делать, вот это (но я не уверен): глобальное ключевое слово Python
Ниже показаны три минимальных воспроизводимых примера кода, который я использовал:1015 *
CODE1 (с глобальным ключевым словом):
a = 0
def my_function():
b=2
if b==0:
print("first if")
global a
if b==2:
print("second if")
a = 2
print("func -> a", a)
print("func -> b", b)
if __name__ == '__main__':
my_function()
print("main -> a", a)
Результат:
second if
func -> a 2
func -> b 2
main -> a 2
CODE2 (без глобального ключевого слова):
a = 0
def my_function():
b=2
if b==0:
print("first if")
if b==2:
print("second if")
a = 2
print("func -> a", a)
print("func -> b", b)
if __name__ == '__main__':
my_function()
print("main -> a", a)
Результат:
second if
func -> a 2
func -> b 2
main -> a 0
CODE3 (с глобальным ключевым словом, но с инвертированными операторами if):
a = 0
def my_function():
b=2
if b==2:
print("second if")
a = 2
print("func -> a", a)
print("func -> b", b)
if b==0:
print("first if")
global a
if __name__ == '__main__':
my_function()
print("main -> a", a)
Результат:
File "global_var_test.py", line 18
global a
^
SyntaxError: name 'a' is used prior to global declaration
Как видно, if b==0:
всегда False и if b==2:
всегда True (печать подтверждает это). Я ожидаю, что CODE1 даст тот же результат, что и CODE2, так как global a
не будет выполнен в первом примере, поэтому он будет таким же, как и пропуск его. Но это дает неутешительный результат, в котором глобальное ключевое слово в любом случае вступает в силу, а глобальная переменная a изменяется на значение 2. После этого я протестировал с CODE3, полагая, что глобальное ключевое слово будет видно во всей функции независимо от ее положения, итогда CODE3 должен дать тот же результат, что и CODE1. Опять же, я был неправ, это сработало так, как если бы global a
собирался быть исполненным (и тогда это было после присвоения и возбуждения исключения).
Затем мой последний вопрос: ¿делаетглобальное ключевое слово (и, возможно, другие, такие как нелокальные и т. д.) имеют видимость в коде в том порядке, в котором они написаны, но независимо от того, что выполняется?
Пожалуйста, помогите мнев разъяснении этого.