看板 Python 關於我們 聯絡資訊
我有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" 呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.72.212.239 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1478763102.A.04B.html
icetofux: 對了,我知道有更簡單的方式可以copy list,我是故意 11/10 15:32
icetofux: 這樣做在實驗,想對python這語言有更多了解,謝謝。 11/10 15:33
gmccntzx1: 你把for element in list1那邊改用enumerate,印出每次 11/10 16:01
gmccntzx1: 跑的index,你就知道為什麼了 11/10 16:01
gmccntzx1: 即`for idx, element in enumerate(list1)` 11/10 16:02
tiefblau: index被你remove移動到拉~ 11/10 16:14
icetofux: 謝謝兩位,我想通這個問題了。 11/10 16:17
LaughPoint: 不懂 list的remove不是刪除指定的值嗎? 11/10 18:10
LaughPoint: remove是記值去刪index嗎? 11/10 18:18
gmccntzx1: 問題是在被迭代的list1被更動,不是remove影響到index 11/10 18:23
LaughPoint: 恩恩 剛剛也想到了 謝謝解答 11/10 18:25
gmccntzx1: 迴圈開始後,index會在每次重新迭代時+1,但是list1長度 11/10 18:25
gmccntzx1: 會逐漸減少,導致迴圈不會執行到原有list1長度的次數 11/10 18:26
gmccntzx1: 而list1中的元素是從index小的開始被移除,所以每往下一 11/10 18:27
gmccntzx1: 次迭代,移除的元素就不是實際上想移除的 11/10 18:27
gmccntzx1: @LaughPoint 不會,小事 11/10 18:28
gmccntzx1: 再幫補充一下,如果真的要用這種做法去移除元素,可以從 11/10 18:29
gmccntzx1: index較大的開始移除; 或著加一個counter,記下已經移除 11/10 18:30
gmccntzx1: 的元素數目,去修正要移除元素的index的位置 11/10 18:30
Yshuan: 很多語言都有這個問題 python不會這樣寫還是真的沒碰過 11/10 19:35
s89227: 真的要寫這種用while條件設list長度會比較好 11/11 01:39
bigpigbigpig: https://ideone.com/hz9s3x 11/11 07:13
checkIO: 我會用while(lista): listb.append(lista()) lista.remo 11/11 23:10
checkIO: ve() 11/11 23:10