Не понимаю неопределенную ссылку - PullRequest
2 голосов
/ 25 января 2020

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

Это похоже на случай со списком , но не простая переменная.

В следующем коде мне сказали, что оператор "aa + = 1 содержит неразрешенную ссылку" aa ", но ссылка на bb [0] просто отлично. Почему что?

aa = 0
bb = [9, 7]

def bbtest():
    aa += 1
    bb[0] += 1

Ответы [ 2 ]

4 голосов
/ 25 января 2020

Это немного неясно, но здесь есть причина для этого: при компиляции функции Python просматривает все используемые там имена и определяет, из какой области они приходят. Имена, которым не назначены, будут использовать внешнюю область (глобальную или нелокальную), имена, которым присвоено , являются локальными. Поскольку aa += 1 считается присваиванием, оно помечает aa как локальную переменную.

Хотя следующая строка выглядит аналогично, она делает что-то другое: нигде вы не присваиваете что-то имени bb. Вы извлекаете что-то из нелокального / глобального имени (списка), а затем присваиваете элементу этого элемента.

Это можно исправить, явно пометив aa как нелокальное или глобальное:

def bbtest():
    global aa
    aa += 1
    bb[0] += 1

С другой стороны, вы можете прервать дело bb, присвоив имя, даже после этого :

def bbtest():
    bb[0] += 1
    bb = "foo"
2 голосов
/ 25 января 2020

Это потому, что в python вы можете получить доступ только к глобальным переменным, но не можете изменять их внутри функций. Вы можете изменить значение bb [0], потому что оно находится внутри глобальной переменной, а не самой переменной. В любом случае, если вы хотите, чтобы это работало, попробуйте объявить "global" в вашей функции следующим образом:

aa = 0
bb = [9, 7]

def bbtest():
    global aa
    aa += 1
    bb[0] += 1
...