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

如何阻止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:04:59