Вы модифицируете и получаете один и тот же список xs
снова и снова.Когда генератор работает, содержимое списка меняется.Похоже, что это работает, потому что, хотя каждый print(x)
печатает один и тот же объект списка, этот объект каждый раз имеет различное содержимое.
С другой стороны, второй цикл запускает генератор до завершения и собирает весь списокссылки вверх. Затем распечатывает списки - за исключением того, что они все одинаковые, поэтому каждая строка одинакова!
Измените две строки print(x)
на print(x, id(x))
, и вы получитепосмотри, что я имею в виду.Все идентификационные номера будут идентичны.
Direct iteration
[1, 2] 140685039497928
[2, 1] 140685039497928
Listing
[1, 2] 140685039497736
[1, 2] 140685039497736
Быстрое решение состоит в том, чтобы получить копии списка вместо исходного списка.yield p
в порядке, но yield xs
должно стать:
yield xs[:]
С этим исправлением, результаты будут такими, как ожидалось:
Direct iteration
[1, 2] 140449546108424
[2, 1] 140449546108744
Listing
[1, 2] 140449546108424
[2, 1] 140449546108808
Те же результаты из обоих циклов,и идентификационные номера разные.