2 回答

TA贡献1852条经验 获得超1个赞
zip 返回一个迭代器,您只能使用一个迭代器一次。
如果元素数量很少,您可以使用这些元素创建一个列表或元组,或者您可以使用itertools.tee原始元素创建多个独立的迭代器:
import itertools
z1, z2 = itertools.tee(zip(mutants, powers), 2)
print(*z1)
print(*z2)
结果:
('charles xavier', 'telepathy') ('bobby drake', 'thermokinesis') ('kurt wagner', 'teleportation') ('max eisenhardt', 'magnetokinesis') ('小猫的骄傲', '无形')
('charles xavier', 'telepathy') ('bobby drake', 'thermokinesis') ('kurt wagner', 'teleportation') ('max eisenhardt', 'magnetokinesis') ('小猫的骄傲', '无形')

TA贡献2051条经验 获得超10个赞
它不会删除它。
如果您执行print(z1)
,您将看到它打印了一个zip 对象。这是因为zip
不会创建 atuple
或 a list
,而是创建迭代器。
迭代器是按需生成值的东西。在这种情况下,zip 对象从输入中生成对;即,mutants
和powers
列表。要查看此操作,在分配之后z1
,您可以调用print(next(z1))
,这会导致z1
生成下一对并打印它;在这种情况下,('charles xavier', 'telepathy')
。
如果您继续调用next(z1)
,它将遍历两个列表,直到到达末尾。此时,它没有数据可供读取,因此如果您next(z1)
再次尝试调用,它将引发StopIteration
异常,这表示可迭代对象已耗尽。
相反,如果您执行类似的操作t1 = tuple(z1)
,则可以根据需要print(*t1)
多次调用。但是,如果您这样做然后尝试调用t2 = tuple(z1)
,您会发现它t2
是空的。这与上面的原因相同:building t1
fromz1
已经耗尽了它,所以当t2
试图从 获取值时z1
,它立即命中StopIteration
并因此生成一个空的tuple
。
添加回答
举报