Python For循环不会覆盖所有对象

Python For循环不会覆盖所有对象,python,list,for-loop,Python,List,For Loop,为什么此for循环不遍历所有项目: temp = 0 for br in my_list : temp +=1 #other code here #my list is not used at all, only br is used inside here my_list.remove(br) print temp assert len(my_list) == 0 , "list should be empty" 所以,断言触发了。然后我添加了临时

为什么此for循环不遍历所有项目:

 temp = 0

 for br in my_list :
    temp +=1
    #other code here
    #my list is not used at all, only br is used inside here
    my_list.remove(br)

 print temp
 assert len(my_list) == 0 , "list should be empty"

所以,断言触发了。然后我添加了临时计数器,我看到尽管我的列表有202个元素,for循环只处理其中的101个。这是为什么?

将my_列表中br的
替换为my_列表中br的
[:]:
。因此,您将迭代源列表的副本。

将my_列表中br的
替换为my_列表中br的
[:]:
。因此,您将迭代源列表的副本。

您不应该从正在迭代的列表中删除。如果您想删除内容,请使用此选项

while list:
   item = list.pop()
   #Do stuff
编辑:如果您想了解有关
pop()
的更多信息,请查看

如果顺序很重要,请使用
pop(0)
pop()
默认情况下删除最后一项,如果要按顺序浏览列表,应使用
pop(0)
删除第一项(索引0)并返回它


编辑2:感谢用户提供的
while list
建议。

您不应该从正在迭代的列表中删除。如果您想删除内容,请使用此选项

while list:
   item = list.pop()
   #Do stuff
编辑:如果您想了解有关
pop()
的更多信息,请查看

如果顺序很重要,请使用
pop(0)
pop()
默认情况下删除最后一项,如果要按顺序浏览列表,应使用
pop(0)
删除第一项(索引0)并返回它


编辑2:感谢用户提出的
while list
建议。

tobias_k是正确的,从您正在迭代的列表中删除项目会导致各种问题

在这种情况下,通过在每个循环上打印列表,使用repl:

for br in my_list:
  my_list.remove(br)
  print my_list
这将产生:

[1, 2, 3, 4, 5]
[1, 3, 4, 5]
[1, 3, 5]
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
最后,我的_列表包含:[1,3,5]

要想做您想做的事情,mic4ael是正确的。最简单(尽管可能不是最有效)的方法是在遍历列表之前复制一份列表,如下所示:

my_list = [0,1,2,3,4,5]
for br in my_list[:]:     #The [:] takes a copy of my_list and iterates over it
  my_list.remove(br)
  print my_list
这将产生:

[1, 2, 3, 4, 5]
[1, 3, 4, 5]
[1, 3, 5]
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]

tobias_k是正确的,从正在迭代的列表中删除项会导致各种问题

在这种情况下,通过在每个循环上打印列表,使用repl:

for br in my_list:
  my_list.remove(br)
  print my_list
这将产生:

[1, 2, 3, 4, 5]
[1, 3, 4, 5]
[1, 3, 5]
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
最后,我的_列表包含:[1,3,5]

要想做您想做的事情,mic4ael是正确的。最简单(尽管可能不是最有效)的方法是在遍历列表之前复制一份列表,如下所示:

my_list = [0,1,2,3,4,5]
for br in my_list[:]:     #The [:] takes a copy of my_list and iterates over it
  my_list.remove(br)
  print my_list
这将产生:

[1, 2, 3, 4, 5]
[1, 3, 4, 5]
[1, 3, 5]
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]

如果您确实需要尽快回收列表中的项目所使用的内存,您可以这样释放它们

for i, br in enumerate(my_list):
    #other code here
    my_list[i] = None

除了在Jython中,Java会在感觉需要时释放它们

如果您确实需要尽快回收列表中的项目所使用的内存,您可以这样释放它们

for i, br in enumerate(my_list):
    #other code here
    my_list[i] = None


除了在Jython中,Java会在感觉像它的时候释放它们

永远不要从您正在迭代的列表中删除它们!还有,为什么不在循环之后清除列表呢?或者使用
过滤器
或条件列表理解,具体取决于您想要实现的目标。使用临时列表存储您想要从第一个列表中删除的项目从列表的前面删除项目也是低效的。是否需要在循环中删除它们?考虑使用CopysDebug。为什么要从列表中删除所有项目?您可以在处理完列表后停止使用它。@mkrieger1但是,如果您的内存有限,而这不是一个可靠的选项,那么您将依靠垃圾收集来删除它。此外,python并不以垃圾收集最好而闻名。千万不要从你正在迭代的列表中删除垃圾!还有,为什么不在循环之后清除列表呢?或者使用
过滤器
或条件列表理解,具体取决于您想要实现的目标。使用临时列表存储您想要从第一个列表中删除的项目从列表的前面删除项目也是低效的。是否需要在循环中删除它们?考虑使用CopysDebug。为什么要从列表中删除所有项目?您可以在处理完列表后停止使用它。@mkrieger1但是,如果您的内存有限,而这不是一个可靠的选项,那么您将依靠垃圾收集来删除它。另外,python的垃圾收集功能也不是最出色的。那么
而list:
呢?@Vincent这也可以,但我不确定它的效率有多高。@Vincent谢谢,我会把它添加到我的答案中。那《while list:
怎么样?@Vincent那也行,但我不确定它有多有效。@Vincent谢谢,我会把它添加到我的答案中。你能解释一下“我的列表中的for br[:]:”与“我的列表中的for br:”有什么不同吗?
我的列表[:]
只需创建源列表的副本。因此,您没有修改源数据结构<代码>id(我的列表)!=id(my_list[:])
您能解释一下“my_list[:]中的for br”与“my_list中的for br:”的区别吗?“
my_list[:]”
只是创建源列表的副本。因此,您没有修改源数据结构<代码>id(我的列表)!=id(我的列表[:])