【问题标题】:Why does the *= operator change numpy arrays out of scope?为什么 *= 运算符将 numpy 数组更改为超出范围?
【发布时间】:2024-01-22 12:18:01
【问题描述】:

我刚刚遇到了 *= 运算符在 python 中用于 numpy 数组的这种奇怪行为(至少对我而言)。如果我将一个局部变量(ndarray)传递给一个函数,然后将其称为 x,然后例如通过 x*= 2 修改 x,则此更改将传播到我调用该函数的范围。如果我做同样的事情但使用 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]

【问题讨论】:

标签: python variables operators variable-assignment numpy-ndarray


【解决方案1】:

某些操作(例如 += 和 *=)会在适当的位置修改现有数组,而不是创建新数组。这就是为什么当第一个函数被调用时,主函数的数组被修改了。

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

【讨论】:

  • 谢谢你,也参考这里的链接。我知道这一点,但很惊讶这甚至适用于不同的范围。