Re: [問題] if 'string' not in i:
※ 引述《sean72 (.)》之銘言:
: #Python 3.3
: a = ['a','b','c','d','x/']
: for i in a:
: if '/' not in i:
: a.remove(i)
: print(a)
: 預期輸出: ['x/']
: 實際輸出: ['b', 'd', 'x/']
: 為什麼 b 和 d 兩個元素無法被濾掉?
: 雖然可以反向繞路 但還是非常疑惑
: tmp = []
: for i in a:
: if '/' in i:
: tmp.append(i)
: print(tmp)
: 感謝幫忙
Python 的 for-in 迴圈是 iterator-based, 不是 index-based
所以你要注意 iterator-based 迴圈的共同特性:
「不能在迴圈內改動你正在 iterate 的東西」(包含新增/移除/更改順序)
因為迴圈所使用的 iterator 是在迴圈開始前產生, 不會在迴圈進行時變動
一旦你改動了該項目, 該 iterator 就無法反映項目的新狀態
這時候就會開始發生一些奇怪的事情(未定義行為)
解法有很多
以你的狀況而言, 最簡單的改寫方案是拷貝一份來 iterate
a = ['a','b','c','d','x/']
for i in list(a):
if '/' not in i:
a.remove(i)
print(a)
因為所有的 Python 變數都是 reference
所以 list(a) 製造出來的新 list 中, 包含的項目與 a 的項目是同樣的東西
注意不是值相同, 而是真的是「同一個」
所以即使你 iterate 的是 list(a) 而非 a 本身, 仍然可以找到 a 裡面的項目
--
「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。
如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」
-- 班尼多‧加羅素,前義大利藍隊成員
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146
推
08/25 00:13, , 1F
08/25 00:13, 1F
推
08/25 00:36, , 2F
08/25 00:36, 2F
→
08/25 00:37, , 3F
08/25 00:37, 3F
推
08/25 23:45, , 4F
08/25 23:45, 4F
推
08/27 09:52, , 5F
08/27 09:52, 5F
→
08/27 09:53, , 6F
08/27 09:53, 6F
→
08/27 09:54, , 7F
08/27 09:54, 7F
推
08/27 11:58, , 8F
08/27 11:58, 8F
推
08/27 12:16, , 9F
08/27 12:16, 9F
推
08/28 16:34, , 10F
08/28 16:34, 10F
推
08/28 18:07, , 11F
08/28 18:07, 11F
→
08/28 18:09, , 12F
08/28 18:09, 12F
討論串 (同標題文章)