为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMMHUHU 2021-11-02 19:04:48
谁能向我解释一下,为什么解压缩一个压缩对象 (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 回答

?
小怪兽爱吃肉

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') ('小猫的骄傲', '无形')



查看完整回答
反对 回复 2021-11-02
?
侃侃无极

TA贡献2051条经验 获得超10个赞

它不会删除它。

如果您执行print(z1),您将看到它打印了一个zip 对象。这是因为zip不会创建 atuple或 a list,而是创建迭代器

迭代器是按需生成值的东西。在这种情况下,zip 对象从输入中生成对;即,mutantspowers列表。要查看此操作,在分配之后z1,您可以调用print(next(z1)),这会导致z1生成下一对并打印它;在这种情况下,('charles xavier', 'telepathy')

如果您继续调用next(z1),它将遍历两个列表,直到到达末尾。此时,它没有数据可供读取,因此如果您next(z1)再次尝试调用,它将引发StopIteration异常,这表示可迭代对象已耗尽

相反,如果您执行类似的操作t1 = tuple(z1),则可以根据需要print(*t1)多次调用。但是,如果您这样做然后尝试调用t2 = tuple(z1),您会发现它t2是空的。这与上面的原因相同:building t1fromz1已经耗尽了它,所以当t2试图从 获取值时z1,它立即命中StopIteration并因此生成一个空的tuple


查看完整回答
反对 回复 2021-11-02
  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号