假设我们有一个列表,我想逐一说清楚。 看看这段代码:
#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太大时我能做什么,以获得更好的性能?
答案 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
,但列表不需要完全具体化,您可以迭代它。