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

Python函数为何修改全局变量?numpy数组传参作用域疑问

问题解答

你的猜测完全正确——函数内的data和全局的data确实指向同一个numpy数组对象,再加上你用了*=这种原地修改可变对象的操作,才导致全局变量的内容被改变。

具体拆解原因:

  • Python传递参数时,传递的是对象的引用。调用function(data, mask)时,函数的参数data拿到的是全局data的引用,两者指向同一个numpy数组实例。你可以在函数内和全局代码里分别打印id(data),会看到输出的内存地址完全一致,这就是最好的证明。
  • numpy数组属于可变对象(和Python列表是同一类,和整数、字符串这类不可变对象不同)。对于可变对象,像*=这种原地赋值操作,会直接修改对象本身的内容,而不是创建一个新的对象返回。所以函数里的修改会直接作用到原数组上。
  • 反过来,如果data是不可变对象(比如整数),执行data *= mask会创建新的对象,函数内的修改就不会影响外部的全局变量。

举个简单的对比例子,把numpy数组换成整数试试:

def function(data, mask):
    data *= mask

data = 5
function(data, 2)
print(data)  # 输出还是5,因为整数是不可变对象,函数内创建了新对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:05:24