在for循环和while循环中使用list.copy()有什么区别

时间:2019-07-05 10:09:01

标签: python

使用while循环

l = [6, 7, 8, 9];

i = 0;
while i < len(l.copy()):
    l.pop();
    i += 1;
print(l);

预期 [] 但实际 [6,7]

使用for循环

l = [6, 7, 8, 9];

for i in range(len(l.copy())): # or using just l.copy the same result
    l.pop();
print(l);

预期结果 []

那么两者之间有什么区别。 为什么while循环l.copy改变了,但是它却不在for循环中?

我的另一个问题是,当我们遇到这样的事情时:

l = [6, 7, 8, 9];

for i in l:
    l.pop();

print (l);

我们得到 [6,7] 因此,如果我想拥有一个空列表,一种解决它的方法是像上面的示例一样使用copy,但是效率不高。另一种方法是通过创建一个保存列表长度的变量,然后在我们的条件内使用它。有更好的方法吗? ,那么我不是在谈论这个特定的例子,我想知道的是为什么条件内的值会发生变化?这是在所有语言中发生还是仅在诸如python或js这样的现代语言中发生?

1 个答案:

答案 0 :(得分:1)

区别不在于l.copy(),而是在于如何使用该值:

while i < len(l.copy()):

vs

for i in range(len(l.copy())):

range生成一个对象,该对象存储在整个循环中,它仅使用l.copy()一次,在循环开始期间评估len-它变得与使用{{1}相同}。

但是range(0, 4)每次您要启动循环时都会检查该值。到那时while发生了变化,因此l及其长度也发生了变化。

要比较的另一件事是存储l.copy(),然后运行while循环:

l.copy()

在这里,l = [6, 7, 8, 9] lcopy = l.copy() i = 0 while i < len(lcopy): l.pop() i += 1 print(l) 已经是副本,它在循环期间不会更改大小(只有lcopy会更改大小,我们现在不每次都创建新副本!)

  

有更好的方法吗?

是的。列表是类并且具有方法,您不必在大多数时间手动进行操作。 -l