为什么 *= 运算符会在范围外更改 numpy 数组?

Why does the *= operator change numpy arrays out of scope?

我刚刚在 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

所以在main函数中没有修改它的值(my_func()).

参考:https://numpy.org/doc/stable/user/quickstart.html#basic-operations