栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从列表中删除项目-在迭代过程中-这个习惯用法有什么问题?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从列表中删除项目-在迭代过程中-这个习惯用法有什么问题?

一些答案解释了为什么会发生这种情况,而另一些则解释了您应该做什么。我会毫不掩饰地拼凑在一起。


这是什么原因?

因为Python语言被设计为以不同方式处理此用例。该文档明确指出:

在循环中修改要迭代的序列是不安全的(这仅适用于可变序列类型,例如列表)。 如果您需要修改要遍历的列表(例如,复制选定的项目),则必须遍历一个副本

强调 我的。有关更多信息,请参见链接的页面-文档受版权保护,并保留所有权利。

您可以很容易地理解为什么得到了自己想要的东西,但是基本上这是未定义的行为,可以很容易地更改,而不会因构建而异。只是不要这样做。

这就像想知道为什么

i += i++ +++i
在针对您的语言的特定编译器版本中,该行对您的体系结构所做的事情到底是怎么回事-包括但不限于破坏计算机并让恶魔从您的鼻子里飞出来:)


如何将其重写以删除所有项目?

  • del letters[:]
    (如果您需要更改对此对象的所有引用)
  • letters[:] = []
    (如果您需要更改对此对象的所有引用)
  • letters = []
    (如果您只想使用一个新对象)

也许您只是想根据条件删除一些物品?在这种情况下,您应该遍历列表的副本。制作副本的最简单方法是使用如下

[:]
语法制作包含整个列表的切片:

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

如果您的检查不是特别复杂,则可以(可能应该)过滤:

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/652137.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号