为什么 *= 运算符会在范围外更改 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
我刚刚在 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