我对列表内置函数pop的一个非常简单的问题感到困惑。
代码很简单。
L=[1,2]
for i in L:
print i
L.pop(0)
它给出了
1
我用更长的列表尝试了它
L=[1,2,3,4,5,6]
for i in L:
print i
L.pop(0)
它给了我
1
3
5
所以,回到第一个代码,我想到的是'对于我在L'的行,for循环将首先运行'1',因此它将打印i然后L.pop(0)将从L中移除'1'然后,将有另一个'L in L'循环,它将打印2,使L为空列表。但是,它仅返回1,而在第二种情况下则返回1,3,5。 我在这里缺少什么?
答案 0 :(得分:3)
我在这里缺少什么?
您在这里缺少for
循环的一些基本概念。
您使用pop(0)
从列表的开头弹出。因此,在弹出之后,所有元素都向左移动一个位置,从而改变每个剩余元素的索引。在这种情况下,for
循环的next()
方法yield
新保留的当前索引元素。因此,您会看到这种行为。
如果您通过添加一些print
语句来更改代码,则会更加清晰。
L=[1,2,3,4,5,6]
for i in L:
print L, i
L.pop(0)
# Output
[1, 2, 3, 4, 5, 6] 1 # It has index 0 here
[2, 3, 4, 5, 6] 3 # It has index 1 here
[3, 4, 5, 6] 5 # It has index 2 here
# 6 is not printed here as it has index 3 to print here but our L is reduced to [4, 5, 6] which does not contain any index 3
答案 1 :(得分:0)
L=[1,2]
for i in L:
print i
L.pop(0)
在此示例中,您将输出为1,因为foreach循环仅运行一次。在i = 0的第一次迭代中,L [i]等于1并打印它。当您从列表中弹出一个项目时,列表的长度为1.因此,在L.pop(0)语句之后,foreach循环将自动中断
L=[1,2,3,4,5,6]
for i in L:
print i
L.pop(0)
在此代码中,考虑第一次迭代,其中i = 0。它将打印1.然后通过弹出列表的列表长度中的第一个元素将是5.现在列表自动调整为[2,3,4,5,6]。通过考虑当i等于1时的下一次迭代,它将打印3,其中L [1] = 3。之后弹出列表的第一个元素,导致L = [3,4,5,6]。最后打印5为L [2]。