Функция zip() в python 3
Я знаю, как использовать функцию zip()
в Python 3. Мой вопрос касается следующего, которое я как-то чувствую весьма странно:
Я определяю два списка:
lis1 = [0, 1, 2, 3]
lis2 = [4, 5, 6, 7]
и я использую zip()
для них следующими способами:
1. test1 = zip( lis1, lis2)
2. test2 = list(zip(lis1, lis2))
когда я набираю test1
у интерпретатора, я получаю следующее:
"zip object at 0x1007a06c8"
Итак, я набираю list(test1)
у интерпретатора, и я получаю ожидаемый результат, но когда я снова набираю list(test1)
, я получаю пустой список.
То, что я нахожу особенным, заключается в том, что независимо от того, сколько раз я набираю test2
в интерпретаторе, я всегда получаю предполагаемый результат и никогда не пустой список.
Ответы
Ответ 1
В отличие от Python 2, функция zip
в Python 3 возвращает итератор. Итераторы могут быть исчерпаны (что-то вроде составления списка из них) один раз. Целью этого является сохранение памяти за счет генерирования только элементов итератора по мере необходимости, а не помещения всего в память сразу. Если вы хотите повторно использовать свой заархивированный объект, просто создайте список из него, как и во втором примере, а затем продублируйте список примерно так:
test2 = list(zip(lis1,lis2))
zipped_list = test2[:]
zipped_list_2 = list(test2)
Ответ 2
zip()
функция в Python 3 возвращает итератор. Именно поэтому, когда вы печатаете test1
, вы получаете - <zip object at 0x1007a06c8>
. Из документации -
Создайте итератор, который объединяет элементы из каждого из повторяющихся.
Но как только вы это сделаете - list(test1)
- вы исчерпали итератор. Поэтому после этого в любое время, когда вы делаете list(test1)
, вы получите пустой список.
В случае test2
вы уже создали список один раз, test2
- это список, и, следовательно, всегда будет этот список.