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

Python中列表右移后修改首元素引发多元素变更的问题

问题原因与解决方法

原因

Python中,列表属于可变对象,直接赋值操作(比如a[i] = a[i-1])传递的是列表的引用,而非创建新的列表副本。

看你的shiftArray函数:

  1. 首先o = a[0]拿到了第一个子列表的引用;
  2. 循环中从后往前赋值a[i] = a[i-1],当i=1时,a[1]被赋值为a[0]的引用,此时arr[0]和arr[1]指向同一个子列表对象;
  3. 最后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:45:47