Python多维数组传参本质是传对象引用:嵌套列表修改子元素或整行会改变原数组,NumPy数组原地操作也影响原数据;避免意外修改需用copy.deepcopy()或ndarray.copy()。

Python 中多维数组作为方法参数传递时,本质仍是传对象引用——不是复制整个嵌套结构,而是把最外层数组(如 list 或 numpy.ndarray)的引用传入函数。关键在于:可变对象的内部结构能否被修改,取决于你如何操作它。
多维列表(嵌套 list)的传递行为
多维列表在 Python 中通常用嵌套列表表示,例如 [[1, 2], [3, 4]]。它本身是可变对象(list 类型),其每个子列表也是独立的 list 对象。
- 函数内直接修改子列表元素(如
arr[i][j] = ...)会反映到原数组 - 函数内替换某一行(如
arr[0] = [...])也会改变原数组(因为修改了外层 list 的索引项) - 但若仅重新赋值参数名(如
arr = [...]),不会影响外部变量(只是让形参指向新对象)
def modify_nested(arr):
arr[0][0] = 99 # ✅ 修改生效:原列表第一行第一个元素变为 99
arr[1] = [7, 8] # ✅ 替换整行,原列表第二行被替换成新列表
arr = [[0]] # ❌ 无效:仅改变形参 arr 的指向,不影响调用方
data = [[1, 2], [3, 4]]
modify_nested(data)
print(data) # 输出 [[99, 2], [7, 8]]NumPy 多维数组的传递行为
numpy.ndarray 是一个统一的、连续内存块的对象。传入函数后:
- 所有原地操作(如
arr *= 2、arr[...] = ...、np.multiply(arr, 2, out=arr))都会直接修改原始数组 - 切片(如
arr[1:3, :])默认返回视图(view),修改视图也会影响原数组(除非显式.copy()) - 函数内重新赋值
arr = ...不影响外部;但arr[:] = ...或arr.fill(...)会修改原数据
import numpy as np
def scale_inplace(mat):
mat *= 10 # ✅ 原地缩放,原始数组被修改
# mat = mat * 10 # ❌ 创建新数组,原数组不变
a = np.array([[1, 2], [3, 4]])
scale_inplace(a)
print(a) # 输出 [[10 20], [30 40]]如何避免意外修改原始数据
若不希望函数改动原多维数组,应主动创建副本:
- 列表嵌套:用
copy.deepcopy()(浅拷贝copy.copy()或[:]对嵌套列表无效) - NumPy 数组:用
.copy()方法(如arr.copy())
import copy import numpy as np # 对嵌套列表深拷贝 original = [[1, 2], [3, 4]] safe = copy.deepcopy(original) modify_nested(safe) # 不影响 original # 对 NumPy 数组显式拷贝 arr = np.array([[1, 2], [3, 4]]) func(arr.copy()) # 原 arr 不变
不复杂但容易忽略

















