這是陷阱之一!蟒蛇,可以逃脫初學者。
的words[:]
是神奇的調料在這裏。
觀察:
>>> words = ['cat', 'window', 'defenestrate']
>>> words2 = words[:]
>>> words2.insert(0, 'hello')
>>> words2
['hello', 'cat', 'window', 'defenestrate']
>>> words
['cat', 'window', 'defenestrate']
現在沒有[:]
:
>>> words = ['cat', 'window', 'defenestrate']
>>> words2 = words
>>> words2.insert(0, 'hello')
>>> words2
['hello', 'cat', 'window', 'defenestrate']
>>> words
['hello', 'cat', 'window', 'defenestrate']
這裏要注意的最主要的是words[:]
返回現有列表的copy
,所以你迭代副本,這是沒有修改。
您可以檢查是否正在使用id()
指同一列表:
在第一種情況:
>>> words2 = words[:]
>>> id(words2)
4360026736
>>> id(words)
4360188992
>>> words2 is words
False
在第二種情況:
>>> id(words2)
4360188992
>>> id(words)
4360188992
>>> words2 is words
True
值得注意的是, [i:j]
被稱爲切片運算符,它所做的是返回一個新的t他列出從指數i
開始,高達(但不包括)指數j
。
所以,words[0:2]
給你
>>> words[0:2]
['hello', 'cat']
省略開始索引意味着它默認爲0
,但省略了最後一個索引意味着它默認爲len(words)
,最終的結果是,您將收到副本整個列表。
如果你想使你的代碼更易讀,我建議copy
模塊。
from copy import copy
words = ['cat', 'window', 'defenestrate']
for w in copy(words):
if len(w) > 6:
words.insert(0, w)
print(words)
這基本上和你的第一個代碼片段一樣,並且更具可讀性。
或者(如註釋中的DSM所述)和python> = 3,您也可以使用words.copy()
,它可以做同樣的事情。
因爲你在每次迭代時都會在單詞列表中插入一個元素)) – marmeladze
第一個是最初的「單詞」而不是「單詞」本身的副本 – depperm
在第一個中,你迭代了一個在開始向它添加東西之前拍攝的「詞」的副本。在第二個,你通過'words'試圖循環,使'同時words'長,所以你永遠不會到達終點。 – khelwood