看板 Python 關於我們 聯絡資訊
(Python 2.7) 想請問for loop的寫法中, for x in iterator, 而這個iterator會隨著loop而更動的話 規則是什麼?舉例如下 (1) k=10 for x in range(k): print x, k=k-1 ------------------------------ console: 0 1 2 3 4 5 6 7 8 9 (2) a=range(10) for x in a: print x del(a[len(a)-1]) ---------------------------- console: 0 1 2 3 4 這兩個的都是每次loop中都會改到原始iterator的長相 為什麼系統就認為在(1)的case中:range(k)=range(10) fixed 但是卻在(2)的case中知道要每次都修正一次a 目前我只能說服自己說就這系統對於這兩種寫法有不同作為 請問有規則或其他解釋嗎? 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.255.25.34 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1506156622.A.78D.html
jamesxxx1997: 建議不要在回捐內原地修改 09/23 17:31
jamesxxx1997: 可以改成 : 1. 建立新串列、放入想要的元素 09/23 17:34
j我知道有其他寫法 只是我想知道不同的點XD 因為如果理解正確的話 這兩個print出來要一樣 現在不一樣 一定有哪個地方理解錯了@@
Sunal: 1. in py27 type(range(x)) 是list 09/23 17:36
Sunal: 在(1)裡面 range(k) 就是 [0, 1, 2, ...] 09/23 17:37
Sunal: loop裡面改k自然沒作用 09/23 17:38
S大 可是2.的case type(a)也是list耶 ※ 編輯: znmkhxrw (111.255.25.34), 09/23/2017 17:42:11
Sunal: 這在py3結果也是一樣 09/23 17:40
Sunal: 其實這兩種caes 本來做的事情就不一樣...... 09/23 17:47
Sunal: k=k-1不會去改變list的長度阿 09/23 17:52
wennie0433: 不一樣的事情啊XD 09/23 18:00
stucode: 在for迴圈中,in後面的陳述式只會被求值(evaluated) 09/23 18:35
stucode: 一次。在(1)之中,唯一的那一次就是首次進迴圈呼叫 09/23 18:35
stucode: range(k)求值,之後會利用求值結果[0, 1, ..., 8, 9] 09/23 18:35
stucode: 來進行iteration,無論k在迴圈中如何變化,range(k) 09/23 18:35
stucode: 都不會再被呼叫第二次,也不會影響iteration的過程。 09/23 18:35
bxxl: 樓上正解,range(k)執行一次後就與之後的k值無關 09/23 18:38
bxxl: x in a這個被執行一次則會指向a的本體(不會創造副本) 09/23 18:39
bxxl: 所以去修改a,就會影響loop行為 09/23 18:40
jamesxxx1997: 謝謝bxxl大,受益良多XD 09/23 20:44
原本我也接受這說法 因為可以case1,2都過得去 但是剛剛試了: a=range(10) for x in a: print x a=[2,3] 我跟case2一樣改變a 但是卻跑出跟case1一樣的結果..... ※ 編輯: znmkhxrw (111.255.25.34), 09/23/2017 20:51:59
Sunal: 簡單來說a只是指向range(10) loop裡面只是把a改成指向[2,3] 09/23 21:45
stucode: 就像樓上說的那樣,a=[2,3]只是把名稱a重綁定到一個 09/23 21:59
stucode: 新的list[2, 3],原本的iterator不會因此受到影響。 09/23 21:59
Sunal: 善用id() 就容易理解了 09/23 22:01
好 我試試看 謝謝你們的解釋^^ ※ 編輯: znmkhxrw (111.255.25.34), 09/23/2017 22:04:42
znmkhxrw: 用id真的看出一些端倪 我再比較一下 09/23 22:12
karta0910489: 推詳細 上了一課 09/27 10:33