Python中zip对象循环前后打印结果不同的原因探究
关于zip对象迭代后为空的问题解答
用户代码
users=int(input("enter the number of users whose data you want to enter")) List1=[] List2=[] List3=[] username=[] copied_list=[] for i in range(1,users+1): print(f"Enter first name of user{i}") List1.append(input()) print(f"Enter last name of user{i}") List2.append(input()) print(f"Enter birth year of user{i}") List3.append(input()) Full_Details=zip(List1,List2,List3) print("Before for loop") print(list(Full_Details)) for i in Full_Details: username.append(i[0][0]+i[1]+i[2][-2:]) print("After for loop") print(list(Full_Details))
运行输出
enter the number of users whose data you want to enter2 Enter first name of user1 Harsh Enter last name of user1 sangwan Enter birth year of user1 2003 Enter first name of user2 Dev Enter last name of user2 sharma Enter birth year of user2 2004 Before for loop [('Harsh', 'sangwan', '2003'), ('Dev', 'sharma', '2004')] After for loop []
用户疑问
为何循环前将Full_Details转为列表打印能得到正确内容,循环后打印却为空列表?背后的逻辑是什么?
解答
这是因为zip()函数返回的是一个迭代器对象,迭代器的核心特性就是只能被遍历一次。
当你第一次执行list(Full_Details)时,Python会遍历这个迭代器里的所有元素,把它们转换成列表。这个过程会把迭代器里的元素全部"耗尽"——迭代器内部的指针已经走到了末尾,没有剩余元素了。
所以后面的for i in Full_Details循环根本不会执行任何迭代(因为迭代器已经空了),最后再执行list(Full_Details)自然就得到空列表。
两种解决办法
- 提前转列表保存:把zip对象直接转换成列表,后续所有操作都基于这个列表(列表支持重复遍历)
# 生成zip对象后直接转成列表存好 Full_Details = list(zip(List1, List2, List3)) print("Before for loop") print(Full_Details) for i in Full_Details: username.append(i[0][0]+i[1]+i[2][-2:]) print("After for loop") print(Full_Details)
- 按需重新生成zip对象:如果数据量较大想节省内存,可以在每次需要迭代时重新调用
zip()生成新的迭代器
Full_Details = zip(List1, List2, List3) print("Before for loop") print(list(Full_Details)) # 重新生成zip对象进行遍历 for i in zip(List1, List2, List3): username.append(i[0][0]+i[1]+i[2][-2:]) # 再次重新生成zip对象转列表打印 print("After for loop") print(list(zip(List1, List2, List3)))
内容的提问来源于stack exchange,提问作者Harsh
相关产品推荐
相关产品推荐

