首页 > 解决方案 > for in 循环相同,但结果不同

问题描述


# Problem: Transfer the elements in list1 to list2, and finally list1 is empty

list1=["c++","java","python","sql","javascript"]
list2=[]

我第一次写这个:

for i in list1:
    a=list1.pop()
    list2.append(a)
print("list1=",list1)
print("list2=",list2)

结果:

>>>
list1= ['c++', 'java']
list2= ['javascript', 'sql', 'python']

我很快意识到list1.pop()导致list1不断缩小,我无法获取list1,所以聪明的举动变成了这个,(然后困扰我的问题来了)


list1=["c++","java","python","sql","javascript"]
list2=[]
for i in range(len(list1)):
    a=list1.pop()
    list2.append(a)
print(list1)
print(list2)

结果:

>>>

list1= []
list2= ['javascript', 'sql', 'python', 'java', 'c++']

成功了,因为不知道为什么通过了,所以加了几张打印出来看看过程中发生了什么


list1=["c++","java","python","sql","javascript"]
list2=[]
for i in range(len(list1)):
    print(i)
    print(len(list1))
    print(range(len(list1)))
    print("__ __ __ __ __ __ __ __\n")
    a=list1.pop()
    list2.append(a)
print("list1=",list1)
print("list2=",list2)

结果:

>>>
0
5
range(0, 5)
__ __ __ __ __ __ __ ___

1
4
range(0, 4)
__ __ __ __ __ __ __ ___

2
3
range(0, 3)
__ __ __ __ __ __ __ ___

3
2
range(0, 2)
__ __ __ __ __ __ __ ___

4
1
range(0, 1)
__ __ __ __ __ __ __ ___

list1= []
list2= ['javascript', 'sql', 'python', 'java', 'c++']

按理说 list1 和 range(len(list1)) 是相联的,而且两者同时归约。

但是..我跑了两次,结果显示:for i in range(len(list1))确实保持了初始状态,让我取range(len(list1)),得到i=0,1,2, 3, 4 五个值,但是...for i in list1 以第三个值结束"python"...

标签: python

解决方案


for 指令从 in 之后指定的对象创建一个迭代器。该迭代器在每次迭代时返回该迭代器的 next()。当您从列表中弹出项目(第一种方法)时,next() 在 3 次迭代和停止后不再具有值。当您使用范围时,首先创建范围对象及其迭代器,并且列表弹出保持不变。


推荐阅读