第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從列表中刪除項目-在迭代過程中-這個成語有什么問題?

從列表中刪除項目-在迭代過程中-這個成語有什么問題?

動漫人物 2019-07-17 18:06:55
從列表中刪除項目-在迭代過程中-這個成語有什么問題?作為一個實驗,我做了這個:letters=['a','b','c','d','e','f','g','h','i','j','k','l']for i in letters:     letters.remove(i)print letters最后的打印顯示不是所有的項目都被刪除了?(每個人都是)。IDLE 2.6.2      >>> ================================ RESTART ================================>>> ['b', 'd', 'f', 'h', 'j', 'l']>>>對此有什么解釋?它怎么能被重寫以刪除每一項?
查看完整描述

3 回答

?
qq_花開花謝_0

TA貢獻1835條經(jīng)驗 獲得超7個贊

有些答案解釋了為什么會發(fā)生這種情況,有些則解釋了你應(yīng)該做什么。我會無恥地把這些碎片拼湊在一起。


原因是什么?

因為Python語言旨在以不同的方式處理這個用例。文件明確指出:

在循環(huán)中修改正在迭代的序列是不安全的(這只能發(fā)生在可變序列類型(例如列表)上)。如果您需要修改正在迭代的列表(例如,要復制選定的項),則必須對副本進行迭代。.

強調(diào)我的。有關(guān)更多信息,請參見鏈接頁面-文檔是有版權(quán)的,所有的權(quán)利都是保留的。

你可以很容易地理解為什么你得到了你所擁有的,但它基本上是未定義行為這可以很容易地改變,沒有警告從構(gòu)建到構(gòu)建。別這么做。

就像不知道為什么i += i++ + ++i不管是什么,行在你的體系結(jié)構(gòu)上,在你為你的語言的編譯器的特定構(gòu)建上所做的事情。-包括但不限于砸你的電腦讓惡魔從你的鼻子里飛出來 :)


它怎么能被重寫以刪除每一項?

  • del letters[:]

    (如果需要更改對此對象的所有引用)
  • letters[:] = []

    (如果需要更改對此對象的所有引用)
  • letters = []

    (如果您只想使用新對象)

也許你只是想根據(jù)某種條件刪除一些物品?在這種情況下,您應(yīng)該迭代列表的副本。創(chuàng)建副本的最簡單方法是制作一個包含整個列表的切片,其中包含[:]語法,如下所示:

#remove unsafe commandscommands = ["ls", "cd", "rm -rf /"]for cmd in commands[:]:
  if "rm " in cmd:
    commands.remove(cmd)

如果您的檢查并不特別復雜,您可以(而且可能應(yīng)該)篩選:

commands = [cmd for cmd in commands if not is_malicious(cmd)]


查看完整回答
反對 回復 2019-07-17
?
智慧大石

TA貢獻1946條經(jīng)驗 獲得超3個贊

不能同時迭代列表并對其進行變異,而只能迭代一個片段:

letters=['a','b','c','d','e','f','g','h','i','j','k','l']for i in letters[:]: # note the [:] creates a slice
     letters.remove(i)print letters

盡管如此,對于這樣的簡單操作,您應(yīng)該簡單地使用:

letters = []


查看完整回答
反對 回復 2019-07-17
  • 3 回答
  • 0 關(guān)注
  • 473 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號