问题描述
我刚刚遇到了 Python 中 numpy 数组的 *= 运算符的这种奇怪行为(至少对我而言)。如果我传递一个局部变量 (ndarray),让我们将它称为 x,到一个函数,然后修改 x,例如通过 x*= 2,此更改将传播到我调用该函数的作用域。如果我这样做但使用 x = x*2 我看不到这种行为。这是为什么?我期待 x*=2 和 x=x*2 是相同的。我仅针对 numpy 数组观察到这一点。感谢您的帮助,我还附上了示例代码。
import numpy as np
def my_func1(x_func):
x_func *= 2
return None
def my_func2(x_func):
x_func = x_func * 2
return None
def my_func():
x = np.array([1]) # expect x to keep this value in the scope of my_func
my_func2(x)
print(x) # x still [1]
my_func1(x)
print(x) # x changed to [2]!
my_func()
Out:
[1]
[2]
解决方法
某些操作,例如 += 和 *=,会修改现有数组而不是创建新数组。这就是为什么当第一个函数被调用时,主函数中的数组被修改了。
def my_func1(x_func):
x_func *= 2
return None
修改后的第二个函数没有返回新数组(x_func = x_func * 2),是一个简单的赋值操作。
def my_func2(x_func):
x_func = x_func * 2
return None
所以它的值没有在主函数(my_func())中被修改。
参考:https://numpy.org/doc/stable/user/quickstart.html#basic-operations