python注意事项:range遍历越索引现象、列表边遍历边修改出现的问题

文章目录

  • 前言
  • 一、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]

你可能感兴趣的:(python,基础(语法以及多线程等操作),python,开发语言)