Python中为何仅能通过索引循环修改列表中的字符串元素?
问题:为何遍历列表元素无法修改原列表,而索引循环可以?
我发现尝试修改列表中的字符串元素时存在一个奇怪的特性,示例如下:
ls = ['a','b'] for elem in ls : elem += '!' print(elem) print(ls) # Output: # a! # b! # ['a','b']
for i in range(len(ls)) : ls[i] += '!' print(ls) # Output: # ['a!','b!']
为何只有使用索引范围循环时才能修改列表中的字符串?我测试后发现修改整数时也是同样的情况。
解答
核心原因是字符串、整数都是Python里的不可变类型,这类对象一旦创建就不能被修改,所谓的"修改"其实是生成了一个全新的对象。
第一种循环方式
for elem in ls:这里的elem是原列表元素的临时引用副本。执行elem += '!'时,实际是创建了新的字符串对象(比如'a'变成'a!'),接着把这个新对象赋值给临时变量elem,但原列表里的元素仍然指向最初的'a',所以原列表不会有变化。第二种索引循环方式
for i in range(len(ls)):ls[i] += '!'本质是先获取原列表对应位置的元素,生成新对象后,直接把新对象重新赋值给列表的对应索引位置,相当于替换了原列表该位置的引用,因此原列表会被修改。
不管是字符串还是整数,只要是不可变类型,都会出现这个情况。如果是列表、字典这类可变类型,直接遍历修改元素内部的内容时,原列表才会同步变化,但如果是给临时变量重新赋值,同样不会影响原列表。
内容的提问来源于stack exchange,提问作者u-lx
相关产品推荐
相关产品推荐

