我有2個list分別為list1及list2, 想依序一一把list1的元素搬移到list2, 我寫了下
列程式碼:
list1 = []
list2 = []
list1.append("A")
list1.append("B")
list1.append("C")
list1.append("D")
list1.append("E")
list1.append("F")
print("Before:")
print("list1=", list1)
print("list2=", list2)
print("")
print("copying:")
for element in list1:
list2.append(element)
print("list2=", list2)
list1.remove(element)
print("list1=", list1)
print("")
print("After:")
print("list1=", list1)
print("list2=", list2)
輸出結果為:
Before:
list1= ['A', 'B', 'C', 'D', 'E', 'F']
list2= []
copying:
list2= ['A'] #1 : list2.append(element)
list1= ['B', 'C', 'D', 'E', 'F'] #2 : list1.remove(element)
list2= ['A', 'C'] #3 : list2.append(element)
list1= ['B', 'D', 'E', 'F'] #4 : list1.remove(element)
list2= ['A', 'C', 'E'] #5 : list2.append(element)
list1= ['B', 'D', 'F'] #6 : list1.remove(element)
After:
list1= ['B', 'D', 'F']
list2= ['A', 'C', 'E']
#1 把 "A" 加到 list2 與預期相同
#2 把 "A" 從 list1 移除與預期相同
不過#3為什麼是 "C" 被加到 list2 而不是 "B" 呢?
作者: gmccntzx1 (o.O) 2016-11-10 16:01:00
你把for element in list1那邊改用enumerate,印出每次跑的index,你就知道為什麼了即`for idx, element in enumerate(list1)`
作者: gmccntzx1 (o.O) 2016-11-10 18:23:00
問題是在被迭代的list1被更動,不是remove影響到index
作者: gmccntzx1 (o.O) 2016-11-10 18:25:00
迴圈開始後,index會在每次重新迭代時+1,但是list1長度會逐漸減少,導致迴圈不會執行到原有list1長度的次數而list1中的元素是從index小的開始被移除,所以每往下一次迭代,移除的元素就不是實際上想移除的@LaughPoint 不會,小事再幫補充一下,如果真的要用這種做法去移除元素,可以從index較大的開始移除; 或著加一個counter,記下已經移除的元素數目,去修正要移除元素的index的位置