l = ['1', '2', '3', '4', '5']
for num in l:
print('num的地址: ', id(num))
print('删除l[0]元素'); del l[0]
for i in range(len(l)):
print('第%s个元素的地址' % i, id(l[i]))
print('l中还剩的元素', l)
print('\n\n')
题主可以试试运行上面的这段代码.
在我的电脑上, l中各元素在电脑中的地址是:
2138178117960 -> '1'
2138181612520 -> '2'
2138178949616 -> '3'
2138177877080 -> '4'
2138181612576 -> '5'
运行结果如下:
num的地址: 2138178117960
删除l[0]元素
第 0 个元素的地址 2138181612520
第 1 个元素的地址 2138178949616
第 2 个元素的地址 2138177877080
第 3 个元素的地址 2138181612576
l中还剩的元素 ['2', '3', '4', '5']
num的地址: 2138178949616
删除l[0]元素
第 0 个元素的地址 2138178949616
第 1 个元素的地址 2138177877080
第 2 个元素的地址 2138181612576
l中还剩的元素 ['3', '4', '5']
num的地址: 2138181612576
删除l[0]元素
第 0 个元素的地址 2138177877080
第 1 个元素的地址 2138181612576
l中还剩的元素 ['4', '5']
为什么循环只执行了 3 次?
其实要想知道这个问题, 我们需要知道for循环是怎么实现其功能的.
python3中的for循环实现需要借助迭代器.(感谢评论区@黄裳提醒,我没有试着分析过在python2中的执行情况,写出了有歧义的句子,不好意思。)
感兴趣的同学可以尝试我上面的方法或者其他方法分析一下题主代码在python2中的执行情况。
题主的代码实际上可以用以下几行代码代替:
l = ['1', '2', '3', '4', '5']
temp = iter(l)
num = next(temp) # 此时 num=1
del l[0] # 删除了 '1'
num = next(temp) # 此时 num=3
del l[0] # 删除了 '2'
num = next(temp) # 此时 num=5
del l[0] # 删除了 '3'
num = next(temp) # 触发 StopInteration 异常, 循环中止, 跳出循环
print(l) # ['4', '5']
我看了下题主的信息, 鉴于题主可能是一个资深程序员, 这段代码就不做过多的解释了, 如果有什么问题, 欢迎指出!