如何阻止Python函数修改传入的NumPy数组?
问题分析与解决方案
你的问题核心是numpy数组是可变对象:当你把t传给函数的total参数时,函数内的total只是t的引用,执行total += vectors[i]会直接修改原数组的内容,而非创建新对象。以下是两种针对性解决方法:
一、完全避免修改原数组(推荐)
通过操作数组副本,彻底隔离函数内部操作与外部原数组的关联,有两种实现方式:
方式1:函数内创建传入参数的副本
修改函数,在开头复制传入的total,后续操作副本并返回:
import numpy as np def disc(vectors, i, ptr, total): # 创建total的副本,避免修改原数组 current_total = total.copy() if ptr[i] < 0: return current_total else: current_total += vectors[i] return disc(vectors, ptr[i], ptr, current_total) testvec=np.array([[0,0],[1,0],[0,0],[0,0],[1,-1],[0,-1],[1,-1],[0,-1],[0,0]]) ptr=np.array([-10,2,-6,-10,2,2,4,4,-10]) t=np.array([0,0]) print(disc(testvec,7,ptr,t)) # 输出 [1 -2] print(t) # 输出 [0 0],原数组未被修改 print(disc(testvec,1,ptr,t)) # 输出 [1 0]
方式2:设置默认初始值,自动创建副本
如果不需要每次传入初始值,可将total设为可选参数,在函数内初始化并复制:
import numpy as np def disc(vectors, i, ptr, total=None): # 初始化或复制传入的total if total is None: current_total = np.array([0, 0]) else: current_total = total.copy() if ptr[i] < 0: return current_total else: current_total += vectors[i] return disc(vectors, ptr[i], ptr, current_total) testvec=np.array([[0,0],[1,0],[0,0],[0,0],[1,-1],[0,-1],[1,-1],[0,-1],[0,0]]) ptr=np.array([-10,2,-6,-10,2,2,4,4,-10]) t=np.array([0,0]) print(disc(testvec,7,ptr)) # 无需传入total,默认从[0,0]开始 print(t) # 原数组仍为[0 0] print(disc(testvec,1,ptr,t)) # 传入自定义初始值,也不会修改t
二、在函数内重置传入数组为[0,0](不推荐)
如果确实需要在函数内修改原数组,可通过切片赋值直接修改数组内容(注意:这会直接改变外部的t):
import numpy as np def disc(vectors, i, ptr, total): # 重置total为[0,0],会同步修改外部的t total[:] = [0, 0] if ptr[i] < 0: return total else: total += vectors[i] return disc(vectors, ptr[i], ptr, total) testvec=np.array([[0,0],[1,0],[0,0],[0,0],[1,-1],[0,-1],[1,-1],[0,-1],[0,0]]) ptr=np.array([-10,2,-6,-10,2,2,4,4,-10]) t=np.array([0,0]) print(disc(testvec,7,ptr,t)) # 输出 [1 -2] print(t) # 输出 [1 -2],原数组已被修改
这种方式会直接改动外部数组,可能导致后续调用的初始值不符合预期,仅在明确需要修改原数组时使用。
内容的提问来源于stack exchange,提问作者jore1
相关产品推荐
相关产品推荐

