文章目录
- 前言
- 一、range遍历越索引现象
- QS1:遍历range(2,2)会发生什么?不会报错,但是也不会遍历到任何内容
- QS1:遍历range(3,2)会发生什么?不会报错,但是也不会遍历到任何内容
- 二、列表边遍历边修改注意事项(Java的List系列集合使用 for-each 循环或 Iterator 遍历集合时也会有下面问题)
- 1 避免直接修改列表长度:特别是边遍历边append和pop元素
- 2 边遍历边修改里面元素的值:这个是安全的,一般是结合enumerate 获取索引一起遍历
前言
一、range遍历越索引现象
QS1:遍历range(2,2)会发生什么?不会报错,但是也不会遍历到任何内容
for i in range(2,2):
print(i) # 不会报错,但是也不会输出任何内容
answer:不会报错,但是也不会遍历到任何内容
QS1:遍历range(3,2)会发生什么?不会报错,但是也不会遍历到任何内容
for i in range(3,2):
print(i) # 不会报错,但是也不会输出任何内容
answer:不会报错,但是也不会遍历到任何内容
上面的这种range越索引不会报错,也不会遍历到内容,其实在遍历的结尾出用到的非常频繁
(1)range 函数本身不会引发索引越界错误,因为它生成的是一个惰性序列(在 Python 3 中),而不是直接生成一个完整的列表。
(2)range 生成的序列是动态计算的,只有在迭代时才会生成值。因此,即使你定义的 range 范围不合理(比如 range(3, 2)),它也不会引发索引越界错误,而是直接生成一个空序列。
二、列表边遍历边修改注意事项(Java的List系列集合使用 for-each 循环或 Iterator 遍历集合时也会有下面问题)
1 避免直接修改列表长度:特别是边遍历边append和pop元素
- 问题:遍历时直接增删元素会改变列表长度,导致索引错位或跳过元素。
- 解决方案:
- 遍历副本(保险还是深拷贝遍历比较安全),修改原列表。
- 使用 enumerate 获取索引
- 直接创建一个新的列表(使用列表推导式创建新列表),满足条件的往这个里面加
- 直接使用 filter 函数过滤
2 边遍历边修改里面元素的值:这个是安全的,一般是结合enumerate 获取索引一起遍历
lst = [1,3,2,2,6,7,9,2,3,6,2]
for i,e in enumerate(lst):
if e == 2:
lst[i] = 4
print(lst) # [1, 3, 4, 4, 6, 7, 9, 4, 3, 6, 4]