任何人都可以向我解释一下,为什么解压缩一个压缩的对象(z1)会使初始对象(z1)空着?
mutants = ['charles xavier', 'bobby drake',
'kurt wagner', 'max eisenhardt', 'kitty pride']
powers = ['telepathy', 'thermokinesis',
'teleportation', 'magnetokinesis', 'intangibility']
z1 = zip(mutants, powers)
print(*z1)
print(*z1)
答案 0 :(得分:2)
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') ('kitty pride', 'intangibility') ('charles xavier', 'telepathy') ('bobby drake', 'thermokinesis') ('kurt wagner', 'teleportation') ('max eisenhardt', 'magnetokinesis') ('kitty pride', 'intangibility')
答案 1 :(得分:1)
它不会删除它。
如果执行print(z1)
,您会看到它会打印一个 zip对象。这是因为zip
不会创建tuple
或list
,而是创建 iterator 。
迭代器是按需生成值的东西。在这种情况下,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
为空。这是由于与上述相同的原因:从t1
构建z1
已经用尽了,因此,t2
试图从z1
获取值时,它立即命中{{ 1}},因此会生成一个空的StopIteration
。