Python中列表右移后修改首元素引发多元素变更的问题
问题原因与解决方法
原因
Python中,列表属于可变对象,直接赋值操作(比如a[i] = a[i-1])传递的是列表的引用,而非创建新的列表副本。
看你的shiftArray函数:
- 首先
o = a[0]拿到了第一个子列表的引用; - 循环中从后往前赋值
a[i] = a[i-1],当i=1时,a[1]被赋值为a[0]的引用,此时arr[0]和arr[1]指向同一个子列表对象; - 最后
a[0] = o,而o就是原来的a[0]引用,所以最终arr[0]和arr[1]指向的是同一个子列表。
当你执行arr[0][0] += 1时,实际是修改了这个共享的子列表对象的值,因此arr[1][0]也会同步变化。
解决方法
要避免引用共享,需要在赋值时创建子列表的副本,而不是直接传递引用。常见的创建列表副本的方式有三种:
- 使用列表的
copy()方法:a[i] = a[i-1].copy() - 使用切片语法:
a[i] = a[i-1][:] - 使用
list()构造函数:a[i] = list(a[i-1])
修改后的shiftArray函数示例:
def shiftArray(a): o = a[0].copy() # 这里也需要拷贝,避免后续修改影响o for i in range(len(a)-1, -1, -1): a[i] = a[i-1].copy() a[0] = o return a
另外,如果你原本想实现的是循环右移(比如把最后一个元素移到首位,其余元素右移),可以简化函数逻辑,同时避免引用问题:
def shiftArray(a): if not a: return a # 取出最后一个元素的副本,然后将其余元素右移,最后放到首位 last = a[-1].copy() for i in range(len(a)-1, 0, -1): a[i] = a[i-1].copy() a[0] = last return a
执行修改后的代码,再修改arr[0][0]时,就只会影响arr[0],不会波及arr[1]了。
内容的提问来源于stack exchange,提问作者derpyuser11
相关产品推荐
相关产品推荐

