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

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

global_variable = 'a'

def abc():
    print(global_variable)
    global_variable = 'b'

abc()

когда я его выполняю, я получаю следующее:

Traceback (most recent call last):
  File "/Users/arghyasaha/hobby_project/python_experiment/python_experiment/random_experiment/del_me.py", line 7, in <module>
    abc()
  File "/Users/arghyasaha/hobby_project/python_experiment/python_experiment/random_experiment/del_me.py", line 4, in abc
    print(global_variable)
UnboundLocalError: local variable 'global_variable' referenced before assignment

Чтобы решить эту проблему, мы можем использовать ключевое слово global, подобное этому

global_variable = 'a'

def abc():
    global global_variable
    print(global_variable)
    global_variable = 'b'

abc()

Я ищу объяснение этому поведению, оно похоже на концепцию подъема в javascript. Я нашел немного ресурсов, таких как source1 , source2 , но ни один из них не объяснил достаточно хорошо. Может кто-нибудь дать правильное объяснение того, что именно происходит под капотом в python?

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Обратите внимание, что если вы написали

def cba():
    global_variable = 'b'
    print(global_variable)

cba()

Не было бы исключения. Это потому, что, несмотря на название, global_variable будет локальной переменной в области видимости функции. Любая переменная, которую вы назначаете в функции, является локальной, если вы явно не укажете это иначе.

В функции, когда вы обращаетесь к переменной (как-то используете ее значение, как, например, печатаете ее в этих примерах), python сначала ищет переменную в локальной области, а затем в глобальной области.

def xyz():
    print(global_variable)

Получит доступ к глобальной переменной, например.

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

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

0 голосов
/ 26 октября 2018

Переменная не может быть как локальной, так и глобальной внутри функции.Поэтому Python решает, что нам нужна локальная переменная из-за присваивания global_variable внутри abc (), поэтому первый оператор print перед определением global_variable выдает сообщение об ошибке выше.Любая переменная, которая изменяется или создается внутри функции, является локальной, если она не была объявлена ​​как глобальная переменная.Чтобы сообщить Python, что мы хотим использовать глобальную переменную, мы должны явно указать это, используя ключевое слово "global"

, на которое вы можете ссылаться https://www.python -course.eu / python3_global_vs_local_variables.php для получения дополнительной информации.

0 голосов
/ 26 октября 2018

Проблема в том, что когда вы запускаете код и он входит в функцию, он имеет scope , где global_variable еще не была определена.

0 голосов
/ 26 октября 2018

Это потому, что компилятор Python просматривает все l-значения в блоке кода при определении того, какие переменные являются локальными для этого блока кода.Поскольку в вашем коде global_variable используется в качестве l-значения в функциональном блоке abc, он рассматривается как локальная переменная для кодового блока abc во время компиляции, и поэтому считается, чтоссылаться до того, как ему будет присвоено значение в abc, когда вы попытаетесь print(global_variable), прежде чем назначить global_variable значение в том же блоке.

...