Python中zip对象遍历后为空问题:拆分写法为何失效?
为什么zip对象遍历一次后再用就空了?
核心原因:zip返回的是「只能遍历一次的迭代器」
Python里的zip()函数返回的不是可重复访问的列表,而是迭代器对象。迭代器的核心特性是:一旦你把它里面的元素全部遍历完(比如转成列表、用for循环遍历),它内部的指针就会走到末尾,再也没有元素可以输出——相当于被「耗尽」了。
看你代码里的流程:
ls1 = zip(str1, str2)生成了一个zip迭代器print(list(ls1))这里把迭代器转成列表,等于把迭代器里的所有元素都取了一遍,此时ls1已经被耗尽,没有剩余元素- 之后执行
ls2 = [''.join(x) for x in ls1],遍历的是已经空了的迭代器,自然得到空列表
而单行语句ms1 = ''.join(''.join(x) for x in zip(str1,str2))能正常工作,是因为这里每次调用zip(str1,str2)都会生成一个全新的迭代器,每次遍历的都是新的、未被耗尽的迭代器,所以能拿到所有元素。
解决办法
如果需要复用zip的结果,有两种简单方式:
- 提前把迭代器转成列表保存:
ls1 = list(zip(str1, str2)),这样ls1是普通列表,可以多次遍历 - 每次需要遍历的时候重新调用
zip(str1, str2)生成新的迭代器
内容的提问来源于stack exchange,提问作者Chidambaram P
相关产品推荐
相关产品推荐

