python for循环和删除方法

时间:2015-07-26 05:07:57

标签: python performance

假设我们有一个列表,我想逐一说清楚。 看看这段代码:

#code1
>>> x=[9,0,8,1,7,2,5]
>>> for i in x :
      x.remove(i)
>>> x
[0, 1, 2]

最后x不清楚。为什么? 和

#code2:
>>> for i in x :
      x.remove(x[0])
>>> x
[7, 2, 5]

此代码与code1类似。 比较代码3中的两个代码,为什么它们不像这样:

#code3:
>>> while x:
    x.remove(x[0])
>>> x
[]

我有关于for / while循环的另一个问题, 当python运行时:

for i in x 

while x

所有x内容都在内存/内存中吗?如果是的话,当x太大时我能做什么,以获得更好的性能?

编辑:

plz解释代码中输出的差异: enter image description here

1 个答案:

答案 0 :(得分:3)

当您说for i in x时,您使用的是迭代器

当循环运行时,此迭代器将当前位置存储在x中。如果在循环仍在进行时修改正在迭代的对象的状态(x),则迭代器对象不知道这一点。

这就是为什么使用for i in x不能运行正确的次数:当你删除元素时,列表的大小会缩小,导致迭代器超出(现在缩小)列表的末尾,导致即使列表尚未为空,也要终止循环。 while循环没有使用迭代器:它只是一个条件检查。

您可以通过迭代 <{em> x的副本来查看此操作:

for i in x[:]:
    x.remove(x[0])

或者通过迭代x中的索引:

for i in range(len(x)):
    x.remove(x[0])

要回答第二个问题,如果x很大,请使用生成器函数而不是真实列表。迭代生成器的结果仍然看起来像for i in x,但列表不需要完全具体化,您可以迭代它。