为什么解压缩会删除对象的内容

时间:2019-02-08 16:11:48

标签: python zip

任何人都可以向我解释一下,为什么解压缩一个压缩的对象(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)

2 个答案:

答案 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不会创建tuplelist,而是创建 iterator

迭代器是按需生成值的东西。在这种情况下,zip对象生成从输入中获取的对。即mutantspowers列表。要查看此操作的实际效果,在分配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