为什么list.remove()的行为不像人们预期的那样?

Ale*_*ron 7 python

from pprint import *

sites = [['a','b','c'],['d','e','f'],[1,2,3]]

pprint(sites)

for site in sites:
        sites.remove(site)

pprint(sites)
Run Code Online (Sandbox Code Playgroud)

输出:

[['a', 'b', 'c'], ['d', 'e', 'f'], [1, 2, 3]]
[['d', 'e', 'f']]
Run Code Online (Sandbox Code Playgroud)

为什么不是None,或者是空列表[]?

小智 25

这是因为你正在迭代它时修改一个列表.你永远不应该这样做.

对于这样的事情,你应该复制一下列表并对其进行迭代.

for site in sites[:]:
    sites.remove(site)
Run Code Online (Sandbox Code Playgroud)

  • "你永远不应该这样做"值得更加重视. (7认同)
  • 谢谢.我永远不会这样做. (4认同)

小智 6

因为在迭代它时调整集合的大小是Python相当于C和C++中未定义的行为.您可能会遇到异常或巧妙的错误行为.只是要这样做.在这种特殊情况下,可能发生的事情是:

  • 迭代器以索引0开始,存储它在索引0处,并为您提供存储在该索引处的项目.
  • 您删除索引0处的项目,之后的所有内容都向左移动一个以填充该孔.
  • 迭代器被要求提供下一个项目,并忠实地将索引增加1,将1作为新索引存储,并为您提供该索引处的项目.但由于所述remove操作引起的项目移动,索引1处的项目是从索引2(最后一项)开始的项目.
  • 你删除它.
  • 迭代器被要求下一个项目,但是当下一个索引(2)超出范围(现在只是0..0)时,信号结束迭代.