разница в zip-итераторе и списке

У меня есть список под названием «A», также есть итератор с именем «B», «B» - это итератор «A».

A = [1, 2, 3, 4, 5, 6, 7, 8, 9]

B = iter(A)

Выход zip(A,A,A)

[(0, 0, 0),
 (1, 1, 1),
 (2, 2, 2),
 (3, 3, 3),
 (4, 4, 4),
 (5, 5, 5),
 (6, 6, 6),
 (7, 7, 7),
 (8, 8, 8)]

Выход zip(B, B, B)

[(0, 1, 2), (3, 4, 5), (6, 7, 8)]

Кто-нибудь может объяснить разницу


person Arun    schedule 19.12.2018    source источник


Ответы (1)


Это просто. Как работает zip? он создает итераторы для каждого заархивированного элемента и проходит через них.

Когда вы передаете zip(A,A,A), он создает 3 итератора, каждый из которых будет начинаться с A[0].

Когда вы проходите zip(B,B,B), у вас уже есть итератор. Чтобы создать первый элемент результирующей последовательности, он вызывает B.__iter__() 3 раза. Таким образом, вы получаете 0,1,2. Для второго элемента он снова вызывает B.__iter() 3 раза, таким образом получая 3,4,5 и так далее.

person grapes    schedule 19.12.2018
comment
На самом деле zip не создает итераторов для каждого заархивированного элемента. - person DYZ; 19.12.2018