python - for i in list 如果列表变动的话

本文探讨了在Python中使用`for i in list`时,如果列表在循环过程中发生变动,循环行为会如何受到影响。强调了for循环在开始时固定了可迭代目标,并通过比喻解释了迭代过程如同在固定铁轨上运行。同时提到了避免在循环中改变迭代对象的原因,以及for和while循环的效率对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

l1=list(range(10))
for i in range(len(l1)):
    l1.pop()
    print(i,l1,l1[-1])
#
0 [0, 1, 2, 3, 4, 5, 6, 7, 8] 8
1 [0, 1, 2, 3, 4, 5, 6, 7] 7
2 [0, 1, 2, 3, 4, 5, 6] 6
3 [0, 1, 2, 3, 4, 5] 5
4 [0, 1, 2, 3, 4] 4
5 [0, 1, 2, 3] 3
6 [0, 1, 2] 2
7 [0, 1] 1
8 [0] 0
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-41-ca6fe5f266d2> in <module>
      2 for i in range(len(l1)):
      3     l1.pop()
----> 4     print(i,l1,l1[-1])

IndexError: list index out of range
l1=list(range(10))
for i in l1:
    l1.pop()
    print(i,l1,l1[-1])
#
0 [0, 1, 2, 3, 4, 5, 6, 7, 8] 8
1 [0, 1, 2, 3, 4, 5, 6, 7] 7
2 [0, 1, 2, 3, 4, 5, 6] 6
3 [0, 1, 2, 3, 4, 5] 5
4 [0, 1, 2, 3, 4] 4

for i in 的实质,后面是带iterable的,当这个可迭代结束后,for就结束了。
而i,他属于从索引0开始顺序遍历的iterable对应索引位置上的数值。

如果这不好理解的话,那么来个另类的操作,for的时候,增加迭代目标的长度

l1=list(range(10))
for i in l1:
    l1.append(i*-1)
    print(i,l1)
    if len(l1)==30:break
#
0 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1]
2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2]
3 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3]
4 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4]
5 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5]
6 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6]
7 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7]
8 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8]
9 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
0 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0]
-1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, 1]
-2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, 1, 2]
-3 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, 1, 2, 3]
-4 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, 1, 2, 3, 4]
-5 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, 1, 2, 3, 4, 5]
-6 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, 1, 2, 3, 4, 5, 6]
-7 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, 1, 2, 3, 4, 5, 6, 7]
-8 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, 1, 2, 3, 4, 5, 6, 7, 8]
-9 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l1=list(range(10))
for i in range(len(l1)):
    l1.append(i*-1)
    print(i,l1)
    if len(l1)==30:break
#
0 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1]
2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2]
3 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3]
4 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4]
5 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5]
6 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6]
7 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7]
8 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8]
9 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

目前都是我们的实验框架,但实际操作时,忽略这个问题,误操作,就会出现不可控的情况

l1=list(range(10))
for i in l1:
    l1.append(i*-1)
    print(i,l1)
    del l1[:] # l1.clear()
#
0 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
l1=list(range(10))
for i in l1:
    l1.append(i*-1)
    print(i,l1)
    del l1
#
0 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-47-6e65032a4b1d> in <module>
      1 l1=list(range(10))
      2 for i in l1:
----> 3     l1.append(i*-1)
      4     print(i,l1)
      5     del l1

NameError: name 'l1' is not defined

唯独这个不好解释

for i in list,只运行一次,定位到list,不再变化for的内容

总的来说,当运行到for i in list的时候,这里就固定了的,固定了iterable的目标,就像是铺了铁轨,for内的代码在这个铁轨上运行,除非有意为之,否则要避免铁轨的内容变动。

之前看到避免使用for的情况,大概就指的这个,虽然那文章可能是噱头居多。

例如我们用循环,跳出方式无非规定次数、遍历完元素、规定跳出情况。
while也是完全可以做到的,但是写起来就复杂一些,那么这里捎带对比下for和while的效率

for i in range(1000):
	""
# 18.4 µs ± 241 ns
i=0
while i!=1000:
    i+=1
# 56.5 µs ± 1.58 µs
for i in l:
    ""
# 10.7 µs ± 282 ns
i=0
while i!=1000:
    l[i]
    i+=1
# 96.1 µs ± 2.73 µs

我停止了思考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值