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

