python的for in循环与del

猜猜下面代码的输出:

i = 0
a = [0, 1, 2, 3]
for b in a:
    print(b)
    if b < 2:
         del a[i]
         print('del', a)
    else:
         print(a)
         i+=1

结果是:

0
del [1, 2, 3]
2
[1, 2, 3]
3
[1, 2, 3]

我是刷leetcode的最长回文子串这道题时用了这种写法,然后出事了。
我想要的结果是:del执行之后,b就按顺序取下一个还没取过的值。但显然不是这样。
分析:
for in结构应该是有个计数器没显式给出来,每次循环体结束后:
1、计数器先自加1;
2、进入下一个循环;
3、b的地址=list首地址+计数器
结果现在情况就是:首地址由于del往后挪了,计数器又自增1,而不像你自己的计数器i不自增,因此就和你想要的结果不一样了。

我查了下官方文档,发现我猜对了,官方文档还特意提了这事:

Note

There is a subtlety when the sequence is being modified by the loop (this can only occur for mutable sequences,
e.g. lists). An internal counter is used to keep track of which item is used next, and this is incremented on each
iteration. When this counter has reached the length of the sequence the loop terminates. This means that if the
suite deletes the current (or a previous) item from the sequence, the next item will be skipped (since it gets the
index of the current item which has already been treated). Likewise, if the suite inserts an item in the sequence
before the current item, the current item will be treated again the next time through the loop. This can lead to
nasty bugs that can be avoided by making a temporary copy using a slice of the whole sequence, e.g.,
for x in a[:]:
    if x < 0: a.remove(x)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值