作者znmkhxrw (QQ)
看板Python
標題[問題] for x in iterator(variable) 問題
時間Sat Sep 23 16:50:19 2017
(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://webptt.com/m.aspx?n=bbs/Python/M.1506156622.A.78D.html
1F:推 jamesxxx1997: 建議不要在回捐內原地修改 09/23 17:31
2F:推 jamesxxx1997: 可以改成 : 1. 建立新串列、放入想要的元素 09/23 17:34
j我知道有其他寫法 只是我想知道不同的點XD
因為如果理解正確的話 這兩個print出來要一樣
現在不一樣 一定有哪個地方理解錯了@@
3F:推 Sunal: 1. in py27 type(range(x)) 是list 09/23 17:36
4F:→ Sunal: 在(1)裡面 range(k) 就是 [0, 1, 2, ...] 09/23 17:37
5F:→ Sunal: loop裡面改k自然沒作用 09/23 17:38
S大 可是2.的case type(a)也是list耶
※ 編輯: znmkhxrw (111.255.25.34), 09/23/2017 17:42:11
6F:推 Sunal: 這在py3結果也是一樣 09/23 17:40
7F:推 Sunal: 其實這兩種caes 本來做的事情就不一樣...... 09/23 17:47
8F:推 Sunal: k=k-1不會去改變list的長度阿 09/23 17:52
9F:推 wennie0433: 不一樣的事情啊XD 09/23 18:00
10F:→ stucode: 在for迴圈中,in後面的陳述式只會被求值(evaluated) 09/23 18:35
11F:→ stucode: 一次。在(1)之中,唯一的那一次就是首次進迴圈呼叫 09/23 18:35
12F:→ stucode: range(k)求值,之後會利用求值結果[0, 1, ..., 8, 9] 09/23 18:35
13F:→ stucode: 來進行iteration,無論k在迴圈中如何變化,range(k) 09/23 18:35
14F:→ stucode: 都不會再被呼叫第二次,也不會影響iteration的過程。 09/23 18:35
15F:推 bxxl: 樓上正解,range(k)執行一次後就與之後的k值無關 09/23 18:38
16F:→ bxxl: x in a這個被執行一次則會指向a的本體(不會創造副本) 09/23 18:39
17F:→ bxxl: 所以去修改a,就會影響loop行為 09/23 18:40
18F:推 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
19F:推 Sunal: 簡單來說a只是指向range(10) loop裡面只是把a改成指向[2,3] 09/23 21:45
20F:→ stucode: 就像樓上說的那樣,a=[2,3]只是把名稱a重綁定到一個 09/23 21:59
21F:→ stucode: 新的list[2, 3],原本的iterator不會因此受到影響。 09/23 21:59
22F:推 Sunal: 善用id() 就容易理解了 09/23 22:01
好 我試試看 謝謝你們的解釋^^
※ 編輯: znmkhxrw (111.255.25.34), 09/23/2017 22:04:42
23F:→ znmkhxrw: 用id真的看出一些端倪 我再比較一下 09/23 22:12
24F:推 karta0910489: 推詳細 上了一課 09/27 10:33