鱼C论坛

 找回密码
 立即注册
查看: 2503|回复: 8

[已解决]一个关于zip()函数的奇怪问题

[复制链接]
发表于 2018-5-22 01:02:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:

In [50]: a = zip((1,2,3),('a','b','c'))

In [51]: a

Out[51]: <zip at 0xb655c0ec>

In [52]: list(a)
Out[52]: [(1, 'a'), (2, 'b'), (3, 'c')]

In [53]: list(a)
Out[53]: []


为什么第二次调用list(a)的时候,返回的是一个空列表呢?

最佳答案
2018-5-22 08:17:22
python 3与以前的版本不同,返回的是迭代器,只能单次使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-22 08:17:22 | 显示全部楼层    本楼为最佳答案   
python 3与以前的版本不同,返回的是迭代器,只能单次使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-22 11:14:03 | 显示全部楼层
强答一下(我zip用的很少),希望对楼主有用

依据help(zip), 可以看到zip对象具备迭代性(__iter__,__next__)

>>> a = zip((1,2),(3,4))

>>> for i in a:
        print(i)

       
(1, 3)
(2, 4)  #数据访问结束后,触发 StopIteration。这个就是楼主遇到现象的原因
>>> type(a)
<class 'zip'>

class zip(object)
|  zip(iter1 [,iter2 [...]]) --> zip object
|  
|  Return a zip object whose .__next__() method returns a tuple where
|  the i-th element comes from the i-th iterable argument.  The .__next__()
|  method continues until the shortest iterable in the argument sequence
|  is exhausted and then it raises StopIteration.
|  
|  Methods defined here:
|  
|  __getattribute__(self, name, /)
|      Return getattr(self, name).
|  
|  __iter__(self, /)
|      Implement iter(self).
|  
|  __new__(*args, **kwargs) from builtins.type
|      Create and return a new object.  See help(type) for accurate signature.
|  
|  __next__(self, /)
|      Implement next(self).
|  
|  __reduce__(...)
|      Return state information for pickling.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-22 15:00:53 | 显示全部楼层
thexiosi 发表于 2018-5-22 11:14
强答一下(我zip用的很少),希望对楼主有用

依据help(zip), 可以看到zip对象具备迭代性(__iter__,__ne ...

还是有点不明白  英文看不懂~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-22 15:01:39 | 显示全部楼层
冬雪雪冬 发表于 2018-5-22 08:17
python 3与以前的版本不同,返回的是迭代器,只能单次使用。

还有有点不明白~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-22 15:06:40 | 显示全部楼层
yuandiyuandi123 发表于 2018-5-22 15:00
还是有点不明白  英文看不懂~~

简单来说:zip返回的是单次迭代器,读取完毕后结束

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-22 15:43:18 | 显示全部楼层
thexiosi 发表于 2018-5-22 15:06
简单来说:zip返回的是单次迭代器,读取完毕后结束

哦  那明白啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-22 15:43:55 | 显示全部楼层

以前的版本zip是元组,可以反复用。而新版为什么做成单次使用的,主要是为了节省内存提高效率,每次__next__都只生成一个元素,而不是整个元组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-22 15:44:32 | 显示全部楼层
冬雪雪冬 发表于 2018-5-22 15:43
以前的版本zip是元组,可以反复用。而新版为什么做成单次使用的,主要是为了节省内存提高效率,每次__nex ...

明白啦  谢谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 04:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表