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

Python中传入矩阵副本调用函数后全局数组A为何仍被修改?

问题核心原因

你使用的A[:]、A.copy()操作生成的是列表浅拷贝,无法隔断二维列表内层结构的引用关联:

  • 对一维列表来说,浅拷贝确实会生成完全独立的副本;但对当前的二维嵌套列表,A[:]/A.copy()只会复制最外层的列表容器,容器内部存储的3个子列表(也就是A里每一行的[4,-2,1]这类对象),仍然是和原A共享同一个内存地址的引用。
  • 当create_matrix函数里执行matrix[i][num] = matrix_B[i]时,本质是顺着这个共享引用,直接修改了原A中对应子列表的元素,因此哪怕你没有把函数返回值赋值给全局的A,原数组的内容还是会被改动。
修正方案

你需要让传入函数的matrix参数,是和原A完全无引用关联的独立副本,有两种简单实现方式:

  • 逐行对子列表做拷贝,生成完全独立的二维结构:传参时传入[row.copy() for row in A],让外层列表的每一个行元素都从原数组中独立复制出来。
  • 使用Python标准库的深拷贝方法:导入copy模块,传入copy.deepcopy(A)作为参数,这种方式可以自动断开所有嵌套层级的引用,不管嵌套多少层都不会改动原数组。
修正后的可运行代码
def create_matrix(matrix, matrix_B, num):
    for i in range(3):
        matrix[i][num] = matrix_B[i]
    return matrix

A = [
    [4, -2, 1],
    [8, -1, 1],
    [1, 3, -1],
]
B = [-4, -2, 6]

# 传入逐行拷贝的独立副本给函数
processed = create_matrix([row.copy() for row in A], B, 0)
print(processed)
print(A)

运行上述代码后,输出会完全匹配你预期的效果:函数处理生成的矩阵是替换第一列后的结果,原全局数组A的元素保持初始值不变。

补充说明:函数的返回值本质是你传入的那个matrix对象的引用,因为函数内部没有给matrix变量重新赋值,只是修改了对象的内容,所以最终返回的对象和函数接收的传入参数是同一个独立副本,不会反向影响原数组A的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 12:57:03