You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中使用IN遍历与索引修改列表元素的差异问题咨询

Python列表两种遍历修改方式的差异解答

你提供的测试代码如下:

lines = ['hi', 'hello']

# 第一种:for...in遍历修改
for line in lines:
    line += '*'

# 第二种:索引遍历修改
for i in range(len(lines)):
    lines[i] += '#'

print(lines)

运行输出结果:

['hi#', 'hello#']

1. 两种修改方式的内部实现逻辑差异

  • for...in遍历修改逻辑:
    遍历列表时,临时变量line仅会获取列表元素指向的对象的引用。你执行line += '*'时,因为Python中字符串是不可变类型,该操作不会修改原字符串对象,而是会生成一个新的字符串对象,再把临时变量line的指向修改为这个新对象。整个过程完全没有修改原列表存储的引用,所以原列表的元素不会发生变化。
  • 索引遍历修改逻辑:
    lines[i]是直接访问列表内部存储的第i个引用位置,执行lines[i] += '#'时,生成新的字符串对象后,会直接把列表第i位的引用替换为新对象的地址,所以原列表的元素会发生变更。

2. for...in遍历时的赋值逻辑

是的,本质是将列表每个位置存储的对象引用赋值给for语句的临时变量,不是完全拷贝元素的值。你可以通过一个小例子验证这个逻辑:如果列表存储的是可变类型(比如列表、字典),通过临时变量修改对象内部属性/元素时,原列表的元素也会同步变化:

lines = [[1], [2]]
for line in lines:
    line.append(3)
print(lines) # 输出为 [[1,3], [2,3]]

这种情况会修改原列表,因为临时变量和列表元素指向的是同一个可变对象,修改对象本身不需要变更引用地址。


内容的提问来源于stack exchange,提问作者Steven Hun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:18:03