首页 > 解决方案 > Numpy __isub__ 改变全局变量

问题描述

在最近的一个脚本中,我一直在努力对 NumPy 数组和函数进行一些操作。我终于发现了似乎是错误的地方:NumPy __isub__。

这是一个例子:

def test(apocalypse):
    apocalypse = apocalypse - 3
    return apocalypse

def test2(apocalypse):
    apocalypse -= 3
    return apocalypse

foo = np.array([1,2,3])
print(test(foo))
print(foo)

bar = np.array([1,2,3])
print(test2(bar))
print(bar)

结果是:

[-2 -1  0]
[1 2 3]
[-2 -1  0]
[-2 -1  0]

是预期的吗?应该-=更改全局变量(对于 相同+=)?我尝试过使用 int 和 float 而不是 NumPy 数组,它按预期工作。

标签: python-3.xnumpynamespaces

解决方案


发布答案以防万一有人需要比hpauljWillem Van Onsem快速而好的答案更多的细节。

我假设我们已经了解可变/不可变对象是如何工作的。如果不是,这里我们有一个关于它的答案,在引用与分配上下文中。

我面临的问题是由于isub是一个就地运算符并且它与可变对象一起使用,因此通过赋值传递给test函数的原始变量的对象已更改,与我认为的全局变量无关.

请注意,正如我们所看到的,并不是因为您有一个可变对象,所有操作都会就地更改该对象。示例id

arr = np.array([1,2,3])
print(id(arr))    # prints 139838225358560
arr += 3 
print(arr)        # prints [4 5 6]
print(id(arr))    # prints 139838225358560
arr = arr + 3
print(arr)        # prints [7 8 9]
print(id(arr))    # prints 139838016018832

就地操作符在赋值创建一个新+=对象时执行对象的更改。我的问题也是如此,分别是 和 。arr=apocalypse -= 3apocalypse = apocalypse - 3

Python 文档对就地运算符及其列表进行了简短而良好的解释。


推荐阅读