[問題] for x in iterator(variable) 問題

看板Python作者 (QQ)時間8年前 (2017/09/23 16:50), 8年前編輯推噓12(12012)
留言24則, 7人參與, 最新討論串1/1
(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

09/23 17:31, , 1F
建議不要在回捐內原地修改
09/23 17:31, 1F

09/23 17:34, , 2F
可以改成 : 1. 建立新串列、放入想要的元素
09/23 17:34, 2F
j我知道有其他寫法 只是我想知道不同的點XD 因為如果理解正確的話 這兩個print出來要一樣 現在不一樣 一定有哪個地方理解錯了@@

09/23 17:36, , 3F
1. in py27 type(range(x)) 是list
09/23 17:36, 3F

09/23 17:37, , 4F
在(1)裡面 range(k) 就是 [0, 1, 2, ...]
09/23 17:37, 4F

09/23 17:38, , 5F
loop裡面改k自然沒作用
09/23 17:38, 5F
S大 可是2.的case type(a)也是list耶 ※ 編輯: znmkhxrw (111.255.25.34), 09/23/2017 17:42:11

09/23 17:40, , 6F
這在py3結果也是一樣
09/23 17:40, 6F

09/23 17:47, , 7F
其實這兩種caes 本來做的事情就不一樣......
09/23 17:47, 7F

09/23 17:52, , 8F
k=k-1不會去改變list的長度阿
09/23 17:52, 8F

09/23 18:00, , 9F
不一樣的事情啊XD
09/23 18:00, 9F

09/23 18:35, , 10F
在for迴圈中,in後面的陳述式只會被求值(evaluated)
09/23 18:35, 10F

09/23 18:35, , 11F
一次。在(1)之中,唯一的那一次就是首次進迴圈呼叫
09/23 18:35, 11F

09/23 18:35, , 12F
range(k)求值,之後會利用求值結果[0, 1, ..., 8, 9]
09/23 18:35, 12F

09/23 18:35, , 13F
來進行iteration,無論k在迴圈中如何變化,range(k)
09/23 18:35, 13F

09/23 18:35, , 14F
都不會再被呼叫第二次,也不會影響iteration的過程。
09/23 18:35, 14F

09/23 18:38, , 15F
樓上正解,range(k)執行一次後就與之後的k值無關
09/23 18:38, 15F

09/23 18:39, , 16F
x in a這個被執行一次則會指向a的本體(不會創造副本)
09/23 18:39, 16F

09/23 18:40, , 17F
所以去修改a,就會影響loop行為
09/23 18:40, 17F

09/23 20:44, , 18F
謝謝bxxl大,受益良多XD
09/23 20:44, 18F
原本我也接受這說法 因為可以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

09/23 21:45, , 19F
簡單來說a只是指向range(10) loop裡面只是把a改成指向[2,3]
09/23 21:45, 19F

09/23 21:59, , 20F
就像樓上說的那樣,a=[2,3]只是把名稱a重綁定到一個
09/23 21:59, 20F

09/23 21:59, , 21F
新的list[2, 3],原本的iterator不會因此受到影響。
09/23 21:59, 21F

09/23 22:01, , 22F
善用id() 就容易理解了
09/23 22:01, 22F
好 我試試看 謝謝你們的解釋^^ ※ 編輯: znmkhxrw (111.255.25.34), 09/23/2017 22:04:42

09/23 22:12, , 23F
用id真的看出一些端倪 我再比較一下
09/23 22:12, 23F

09/27 10:33, , 24F
推詳細 上了一課
09/27 10:33, 24F
文章代碼(AID): #1PnY1EUD (Python)