for 循环时候 pop现象

Posted 666sss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了for 循环时候 pop现象相关的知识,希望对你有一定的参考价值。

a = [a,b,c,d,1, 2, 3, 4,5,6,7,8]
for index, x in enumerate(a):
    print("索引是{},列表的长度是{},删除的值是{}".format(index, len(a),a[-1]))
    a.pop()
    print(a)

    print("=" * 20)

print(~~~~~)

a2 = [a,b,c,d,1, 2, 3, 4,5,6,7,8]
for i in a2:
    a2.pop()
    print(a2)

 

`~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

/usr/local/bin/python3.7 /code/pop2.py
索引是0,列表的长度是12,删除的值是8
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4, 5, 6, 7]
====================
索引是1,列表的长度是11,删除的值是7
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4, 5, 6]
====================
索引是2,列表的长度是10,删除的值是6
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4, 5]
====================
索引是3,列表的长度是9,删除的值是5
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4]
====================
索引是4,列表的长度是8,删除的值是4
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3]
====================
索引是5,列表的长度是7,删除的值是3
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2]
====================
~~~~~
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4, 5, 6, 7]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4, 5, 6]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4, 5]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2]

Process finished with exit code 0

 

 

分析下为什么,pop 最后的结果不是     []          ,而是到[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2] 就停止了.

可以看一下第一段代码. 每次迭代的时候,索引值都是在累加.  当索引是5的时候, pop已经删到[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2] 还剩6个.,这6个值的下标是 0,1,2,3,4,5

假设 索引是6 , 那么list里面的值就需要7个.  但是 结果并没有7个值在里面. 所以就暂停了. 

所以,如果继续累加索引的话, 索引是6,值[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1,]    这些值的索引是  0,1,2,3,4   但是这又只有5个值,索引只到4,     所以不存在索引6, 就只有暂停了.

 

 

================= 同理===================

a = [1, 2, 3, 4]
for index, x in enumerate(a):
    print("索引是{},去删除的值是{},列表的长度是{}".format(index, x, len(a)))
    a.remove(x)
    print("=" * 20)
print(a)
 

 

结果如下:

索引是0,去删除的值是1,列表的长度是4
====================
索引是1,去删除的值是3,列表的长度是3
====================
[2, 4]

 

如果索引是2 , 但是 这个上面的[2,4] ,索引只到1,是 0,1 .也不存在索引2,所以,只剩下2和4的结果. 

 

 

注意:

列表的长度在变化,索引值也在变化。这个是容易忽视的一个点,原因是for循环的对象是一个可迭代的对象。

 

 

所以,如果以上列表,循环到[] .可以用下面的方法解决.

a2 = [a,b,c,d,1,2,3,4,5,6,7,8]

print(len(a2))

for i in range(len(a2)):
    # del a2[0]    这个方法也可以,下面的pop也可以 
    a2.pop()
    print(a2)

 

/usr/local/bin/python3.7 /code/pop2.py
12
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4, 5, 6, 7]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4, 5, 6]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4, 5]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3, 4]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2, 3]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1, 2]
[‘a‘, ‘b‘, ‘c‘, ‘d‘, 1]
[‘a‘, ‘b‘, ‘c‘, ‘d‘]
[‘a‘, ‘b‘, ‘c‘]
[‘a‘, ‘b‘]
[‘a‘]
[]

Process finished with exit code 0

 

以上是关于for 循环时候 pop现象的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 这个简单的代码片段显示了如何使用有符号整数在C中完成插值。 for()循环确定要插入的范围

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

为啥带有pop-method(或del语句)的for循环不会遍历所有列表元素

1051 Pop Sequence 需再做

如何在Django视图中使用for循环返回每次迭代[关闭]

如何使用引导程序和 for 循环在 django 中创建电影片段?