问题: Python 遍历列表的三种常用方式

👇 点击展开/折叠 面试背诵模板(建议先背这个) 遍历列表的三种常用方式:① for item in list 直接迭代元素(最简洁,不需要索引时优先);② for i in range(len(list)) 通过索引访问(需修改元素时使用);③ for i, item in enumerate(list) 同时获取索引和值(最灵活,需要索引时推荐)。其他方式如 while 循环(不推荐,手写边界易错)和迭代器(极少直接使用)。选择原则:仅需值用方式①,需修改元素用②,需同时用索引和值用③。
---

三种方式代码对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fruits = ['apple', 'banana', 'cherry']

# 方式1:直接迭代元素(只读最简)
for fruit in fruits:
print(fruit)

# 方式2:通过索引访问(需修改原列表)
for i in range(len(fruits)):
fruits[i] = fruits[i].upper() # 修改元素
print(fruits[i])

# 方式3:枚举同时获取索引和值(最灵活)
for i, fruit in enumerate(fruits):
print(f"索引{i}: {fruit}")

典型应用场景速查表

场景 推荐方式 原因
只读访问每个元素 for item in list 代码最简洁,无需处理索引
修改原列表中的元素 for i in range(len(list)) 通过索引赋值才能修改原对象
需要知道元素位置(如删除或插入) enumerate(list) 同时获取索引和值,逻辑清晰
反向遍历 for item in reversed(list) 或 list[::-1] 内置/切片处理,避免手算索引
边遍历边删除元素 list[:] = [x for x in list if condition] 推导式生成新列表再替换,安全且高效

方式选择的原则

  • 仅需值:用 for item in list —— 可读性最高,性能也足够。
  • 需修改元素:用 for i in range(len(list)) —— 因为赋值操作必须通过索引完成。
  • 需索引和值:用 enumerate(list) —— Pythonic,比 range(len()) 访问更优雅。
  • 需性能:三种方式性能差异极小(微秒级),优先考虑可读性而非微优化。

常见误区与最佳实践

  • 遍历时删除元素:直接 for item in list: list.remove(item) 会跳过元素或引发错误,应改用列表推导式或遍历副本 for item in list[:]。
  • range(len(list)) 过时写法:除非确实需要修改元素,否则 enumerate 是更优选择。
  • for i, _ in enumerate(list) 忽略索引:若需索引但无需值,可用 range(len(list)) 更直接(但通常直接迭代值就够)。
  • 大列表性能:使用 itertools 模块(如 islice)可惰性遍历节省内存,但日常场景极少需要。