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

Python二维数组间赋值仅最后元素生效所有子数组相同问题求解

问题原因与解决方案

核心问题根源

你遇到的两个异常现象的原因完全一致,都是二维数组初始化的错误用法导致:
你使用b = [[None]*4]*4初始化二维数组时,Python仅会创建1个长度为4的[None, None, None, None]列表对象,外层列表的4个元素都是该对象的引用,4个子列表本质指向同一块内存地址。你修改任意一个子列表的元素,所有子列表都会同步变化,这就是所有行被同步赋值的原因。

正确初始化方法

将二维数组的初始化逻辑替换为列表推导式,即可创建每行独立的二维数组:

# 初始化4行4列、初始值为None的二维数组,每一行都是独立列表
b = [[None for _ in range(4)] for _ in range(4)]

问题1修正代码

仅修改数组初始化部分即可,原有赋值逻辑无需改动:

a = [[1,2,3],[4,5,6],[7,8,9]]
# 修正初始化逻辑
b = [[None for _ in range(4)] for _ in range(4)]

yval=0
for y in a:
    xval = 0
    for x in y:
        b[yval][xval] = x
        xval+=1
    yval+=1
print("Grid A:")
print(a)

print("Grid B:")
print(b)

运行后输出和你预期的结果完全一致。

问题2修正代码

同样仅修改初始化部分即可,偏移赋值逻辑无需改动:

a = [[1,2],[3,4]]
# 修正初始化逻辑
b = [[None for _ in range(4)] for _ in range(4)]

yval=0
for y in a:
    xval = 0
    for x in y:
        b[yval+2][xval + 2] = x
        xval+=1
    yval+=1
print("Grid A:")
print(a)

print("Grid B:")
print(b)

运行后会得到右下角22区域为指定值、其余为None的44数组,符合预期。

通用偏移赋值方案

你可以封装一个通用函数适配任意偏移的二维数组赋值需求:

def paste_array(source, target_rows, target_cols, offset_x, offset_y):
    # 初始化目标数组
    target = [[None for _ in range(target_cols)] for _ in range(target_rows)]
    # 赋值
    for y in range(len(source)):
        for x in range(len(source[y])):
            # 做边界判断避免越界,可按需调整
            if offset_y + y < target_rows and offset_x + x < target_cols:
                target[offset_y + y][offset_x + x] = source[y][x]
    return target

# 调用示例:把2*2的a放到4*4数组的右下角(x偏移2,y偏移2)
a = [[1,2],[3,4]]
b = paste_array(a, 4,4, 2,2)
print(b)

内容的提问来源于stack exchange,提问作者Jaedon Lippert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:24:03