Распечатка значения глобальной переменной и затем изменение значения в python - PullRequest
0 голосов
/ 06 февраля 2019

Ключевое слово global используется в функции для ссылки на глобальную переменную внутри этой функции и ее изменения.Однако даже если ключевое слово global не используется и мы просто пытаемся напечатать переменную, python предполагает, что это глобальная переменная, на которую ссылаются, и просто печатает, как это.

a = 2
def foo():
    print(a)
foo()

вышеприведенный код выводит2. Но следующий код выдает ошибку.

a = 2
def foo():
    print(a)
    a = 3
foo()

Я получаю UnboundLocalError, говоря, что локальная переменная 'a' была указана перед присваиванием.Теперь, поскольку python является интерпретируемым языком и выполнение происходит по одной строке за раз, не следует ли сначала вывести глобальное значение a, равное 2 (как в первом случае), а затем создать локальную переменную с тем же именем и назначить его3. Во втором случае, как интерпретатор узнает прямо в операторе print, что я ссылаюсь на другую переменную 'a' в следующей строке?Почему он не ведет себя так, как описано выше?

PS: я понимаю, что использование ключевого слова global может помочь мне изменить значение a с 2 на 3.

1 Ответ

0 голосов
/ 06 февраля 2019

Python байт-код интерпретируется;Исходный код Python сначала компилируется в байтовый код.

Имена являются локальными или глобальными в пределах одной области, и это определение выполняется во время компиляции;Вы не можете переключиться на полпути через функцию.Если в функции есть любое присвоение a, оно является локальным везде в функции, если вы не используете global a.

a = 2
def foo():
    global a
    print(a)
    a = 3

БезГлобальный оператор, print(a) относится к локальному имени a, даже если это происходит до фактического присвоения.

...