码迷,mamicode.com
首页 > 其他好文 > 详细

for 循环时候 pop现象

时间:2019-10-03 18:20:22      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:ESS   方法   pre   through   ===   enumerate   process   span   python3   

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现象

标签:ESS   方法   pre   through   ===   enumerate   process   span   python3   

原文地址:https://www.cnblogs.com/666sss/p/11620024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!