Python 为什么数组这样的Numpy可变变量没有';是否在同一内存上更新值?
我被python中的可变变量弄糊涂了。请参见以下示例代码: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
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
,但为什么?您是否有更多与就地操作相关的示例?请看这里: