Python 为什么数组这样的Numpy可变变量没有';是否在同一内存上更新值?

Python 为什么数组这样的Numpy可变变量没有';是否在同一内存上更新值?,python,numpy,mutable,Python,Numpy,Mutable,我被python中的可变变量弄糊涂了。请参见以下示例代码: In [144]: a=[1,2,3,4] In [145]: b=a In [146]: a.append(5) In [147]: a Out[147]: [1, 2, 3, 4, 5] In [148]: b Out[148]: [1, 2, 3, 4, 5] 由于list是可变的,所以当使用append函数时,它在相同的内存中工作。这对我来说是可以理解的。但是下面的代码让我感到困惑 In [149]: import n

我被python中的可变变量弄糊涂了。请参见以下示例代码:

In [144]: a=[1,2,3,4]

In [145]: b=a

In [146]: a.append(5)

In [147]: a
Out[147]: [1, 2, 3, 4, 5]

In [148]: b
Out[148]: [1, 2, 3, 4, 5]
由于list是可变的,所以当使用append函数时,它在相同的内存中工作。这对我来说是可以理解的。但是下面的代码让我感到困惑

In [149]: import numpy as np

In [150]: a=np.random.randn(3,2)

In [151]: b=a

In [152]: a=a-1

In [153]: a
Out[153]:
array([[-2.05342905, -1.21441195],
       [-1.29901352, -3.29416381],
       [-2.28775209, -1.65702149]])

In [154]: b
Out[154]:
array([[-1.05342905, -0.21441195],
       [-0.29901352, -2.29416381],
       [-1.28775209, -0.65702149]])
既然Numpy数组变量也是可变的,当a=a-1时,为什么不在a引用的同一内存上进行更改?另一方面,a表示具有新值的新内存。

为什么变量a的行为与第一个示例中关于在列表中添加新值5的行为不同,a仍然引用相同的内存?

因为当调用
a=a-1
时,您正在为变量a指定一个新值。。。然后,由于
a-1
没有就地更改
a
,而是创建了另一个对象,因此对该变量的整个内存分配都发生了更改

a = [1,2,3] 
b = a
a = a + [4]
a 
>>> [1,2,3,4] 
b
>>> [1,2,3]

看到了吗?具体来说,它与numpy无关……

简短的回答:
a-=1
已就位,但
a=a-1
a
的内存复制到另一个位置,然后减去
1
。因此,
a
最初指向的位置会发生变化

您可以使用
is
检查此项。
is
关键字表示,如果两个变量是否引用内存中的同一对象,则它与
=
不同

>>将numpy作为np导入
>>>a=np.random.randn(3,2)
>>>b=a
>>>a是b
真的
>>>a,b
(数组([-0.14563848,2.11951025],
[ 0.50913228, -0.61049821],
[2.29055958,-0.83795141]),数组([-0.14563848,2.11951025],
[ 0.50913228, -0.61049821],
[ 2.29055958, -0.83795141]]))
>>>a-=1
>>>a
数组([-1.14563848,1.11951025],
[-0.49086772, -1.61049821],
[ 1.29055958, -1.83795141]])
>>>b
数组([-1.14563848,1.11951025],
[-0.49086772, -1.61049821],
[ 1.29055958, -1.83795141]])
>>>a是b
真的
>>>a=a-1
>>>a
数组([-2.14563848,0.11951025],
[-1.49086772, -2.61049821],
[ 0.29055958, -2.83795141]])
>>>b
数组([-1.14563848,1.11951025],
[-0.49086772, -1.61049821],
[ 1.29055958, -1.83795141]])
>>>a是b
假的

a=a-1是副本分配。a-=1是可变的a-=1不是复制赋值?你能解释更多吗?谢谢。不,不是。它是增广赋值,python对象有一个特定的方法(
\uuu isub\uuuu
),它实现了
numpy.ndarray
操作
-=
类似于
append
,但为什么?您是否有更多与就地操作相关的示例?请看这里: