传入numpy数组作为函数参数时,为何有的函数会修改原数组有的不会?
NumPy函数修改原数组行为差异原因
这一差异本质是两种操作对数组对象的处理逻辑不同,结合Python传参规则即可解释:
Python给函数传递可变对象(比如NumPy数组)时,形参会和外部实参指向同一个内存地址的对象,两个函数的区别在于:
- 函数
f中的array = array/2是重新赋值操作:NumPy的算术运算默认会生成一个全新的数组对象存储计算结果,这行代码执行后,函数内部的array变量会解绑原来的外部数组引用,转而指向新生成的数组,自然不会修改外部原数组的值。 - 函数
g中的array[array > 2] = 2是原地修改操作:这行代码没有给array变量本身重新赋值,只是通过布尔索引直接修改array指向的原内存对象中的元素值,外部实参和形参指向的是同一个对象,所以原数组会同步被修改。
如果希望g也不修改外部原数组,可以在函数开头先做一次深拷贝:
def g(array): array = array.copy() array[array > 2] = 2 return array
内容的提问来源于stack exchange,提问作者GNU_Dawn
相关产品推荐
相关产品推荐

