Я не совсем уверен, стоит ли ожидать такого поведения или нет, но это определенно довольно странно. Когда у вас есть такой код:

def a_function():
    if a_list != some_other_list:
        print(a_list)

Это работает нормально, и у меня не было проблем с этим. Однако, если вы измените его на:

def a_function():
    if a_list != some_other_list:
        a_list = some_other_list

Внезапно возникает проблема, когда говорится, что a_list в строке 2 является неразрешенной ссылкой. Почему то, что содержится в операторе if, влияет на возможность разрешения a_list? Это нормально? Возможно, это ошибка в Python 3.6.1 или PyCharm (Community Edition 2017.1.5)? Любая помощь в разъяснении этого будет принята с благодарностью.

1
Ingsoc 29 Авг 2017 в 22:35

3 ответа

Лучший ответ

Пока вы просто обращаетесь к переменным, которые не являются локальными для вашей функции, все работает нормально, пока они находятся где-то во внешних областях. Но как только вы присваиваете переменную, она становится локальной для вашей функции. Python больше не будет искать во внешней области имя переменной. Итак, когда вы включаете:

a_list = some_other_list

Линия:

a_list != some_other_list

Потерпит неудачу, потому что он больше не ищет a_list вне вашей функции, и если вы определите его позже в функции, это UnboundLocalError или что-то подобное.

Более подробные сведения можно найти в другом ответе, если вы заинтересованы.


В случае, если вы просто хотите сравнить на предмет равенства, измените = (назначение) на == (проверка на равенство).

4
MSeifert 29 Авг 2017 в 19:41

Edit: в python, если вы назначаете переменную внутри области действия функции, она становится локальной переменной. поэтому a_list становится локальным, когда вы a_list = some_other_list и Python сообщает вам об этом, выдавая неразрешенную ссылочную ошибку.


Кроме того, оператор if ожидает выражение, которое возвращает логическое значение.

a_list = some_other_list просто установите some_other_list для ссылки на тот же адрес памяти, что и some_other_listequal, который не возвращает логическое значение.

Однако a_list == some_other_list выполняет сравнение, которое возвращает логическое значение True или False, чтобы указать равенство значений двух переменных.

1
OLIVER.KOO 29 Авг 2017 в 19:56

Существует большая разница между = и == в питоне.

a = b присваивает значение b переменной a.

a == b сравнивает значение a со значением b.

В вашем случае вы хотите использовать ==, который сравнивает два значения и возвращает True, если они совпадают, в противном случае он вернет False.

0
AllenMoh 29 Авг 2017 в 19:37