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
对象上。当然,您可以实现这样的功能,但这是数据模型所说的,它不一定具有“全局”含义。+=
指定会在适当位置更改左侧引用的对象。在本例中,它恰好是传递给函数的全局变量。