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

