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

