Python 增广赋值算子具有全局含义

Python 增广赋值算子具有全局含义,python,function,numpy,addition,Python,Function,Numpy,Addition,我注意到增广加法赋值运算符(+=)在函数中的行为出乎意料。见下文: import numpy as np def f(array): array += 1 return array x = np.ones(5) print(x) y = f(x) print(x) 这将产生: [ 1. 1. 1. 1. 1.] [ 2. 2. 2. 2. 2.] 因此,正在函数中修改数组x。有人能解释一下吗?如果我使用x=x+1而不是x+=1,则行为与预期一致(即函

我注意到增广加法赋值运算符(+=)在函数中的行为出乎意料。见下文:

import numpy as np

def f(array):
    array += 1
    return array

x = np.ones(5)

print(x)

y = f(x)

print(x)
这将产生:

[ 1.  1.  1.  1.  1.]
[ 2.  2.  2.  2.  2.]
因此,正在函数中修改数组
x
。有人能解释一下吗?如果我使用
x=x+1
而不是
x+=1
,则行为与预期一致(即函数内的更改不会影响其外部的数组
x

显然,这并没有给我带来任何问题(更多)-解决方案很简单。只是想了解为什么会发生这种情况


谢谢

。Numpy的行为似乎是基于列表的行为。像
+=
*=
这样的复合运算符通常在集合上是变异的。确切地说:一个是增量运算符,它在适当的位置变异数组。另一个是赋值,它创建了一个新名称,并且数组可能是这个名称的副本,这与函数的内部和外部无关。相反,增广赋值运算符应该在集合可变的地方(即,它们是mutator方法)进行操作。因此,这不会发生在
str
对象上,但会发生在
list
对象上。当然,您可以实现这样的功能,但这是数据模型所说的,它不一定具有“全局”含义。
+=
指定会在适当位置更改左侧引用的对象。在本例中,它恰好是传递给函数的全局变量。。Numpy的行为似乎是基于列表的行为。像
+=
*=
这样的复合运算符通常在集合上是变异的。确切地说:一个是增量运算符,它在适当的位置变异数组。另一个是赋值,它创建了一个新名称,并且数组可能是这个名称的副本,这与函数的内部和外部无关。相反,增广赋值运算符应该在集合可变的地方(即,它们是mutator方法)进行操作。因此,这不会发生在
str
对象上,但会发生在
list
对象上。当然,您可以实现这样的功能,但这是数据模型所说的,它不一定具有“全局”含义。
+=
指定会在适当位置更改左侧引用的对象。在本例中,它恰好是传递给函数的全局变量。