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
我停止了思考
版权声明:本文为jhsxy2005原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。