Назначение / создание списка в Python с неожиданным поведением - PullRequest
1 голос
/ 30 мая 2020

Я играл с блоком кода, во время которого я наткнулся на неожиданное поведение Python.

Я определил список следующим образом:

a = [1, 2, 3]

Сделал другой список с al oop:

res = (item for item in a if a.count(item) > 0)
print(list(res)) # [1, 2, 3] -- as expected -- Consider this is line 1

Затем позже я изменил начальное значение первого списка:

a = [7, 2, 9]

Я не ожидал никаких изменений в res, поскольку изменения, которые я внес в a были после создания res, но, к моему удивлению, значение res было изменено.

print(list(res)) # prints [] -- Consider this as line 2

Что еще шокирует, так это то, что результат печати зависит от оператора печати в строке 1, если Я комментирую оператор печати в строке 1, затем строка 2 выводит [2]

Кто-нибудь, пожалуйста, объясните мне, что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 30 мая 2020

res = (item for item in a if a.count(x) > 0) создает генератор, который исчерпывается вызовом list(res).

Когда вы вызываете следующий list(res), он возвращает пустой список - []

рассмотрите возможность создания списка сначала, например res = [item for item in a if a.count(x) > 0].

0 голосов
/ 30 мая 2020

Хорошо, я думаю, я понял, я не создавал другой список с этим l oop, а я создавал что-то, называемое генератором.

Который может быть преобразован в список только один раз, поэтому он печатает [], если я даю оператор печати в строке 1.

И он изменяет себя в соответствии со значением a, пока он не будет исчерпан .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...