Подтвердить что ты не робот

Функция 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 в интерпретаторе, я всегда получаю предполагаемый результат и никогда не пустой список.

4b9b3361

Ответ 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 - это список, и, следовательно, всегда будет этот список.