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
相关产品推荐
相关产品推荐

