推 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