Numpy变量赋值是通过引用?

时间:2018-02-19 18:26:34

标签: python numpy reference

这是最小的代码:

A = np.zeros((2,2))
B = A
A[0,0] = 2
print A
print B

输出:

[[ 2.  0.]
 [ 0.  0.]]
[[ 2.  0.]
 [ 0.  0.]]

我希望B保持不变,但是它更新为A的新值?这背后的机制是什么,知道为什么/何时会发生这种情况的一般规则是什么?这似乎有点危险......

1 个答案:

答案 0 :(得分:2)

这通常是python行为,而不是numpy特有的。如果您有list之类的对象,您会看到类似的行为。

a = [1]
b = a
b[0] = 7
print a
print b

将输出

[7]
[7]

这是因为变量a指向数组[1]所在的内存位置,然后使b指向同一位置。因此,如果该位置的值发生变化,则两个变量仍然指向那里。如果你想绕过这种行为,你需要像这样使用.copy()函数。

A = np.zeros((2,2))
B = A.copy()
A[0,0] = 2
print A
print B

输出..

[[2. 0.]
[0. 0.]]
[[0. 0.]
[0. 0.]]

使用copy()函数将生成一个全新的对象,而不是指向旧的对象。 注意:这可能不是理想的方法,因为复制一个巨大的numpy数组可能是计算上昂贵的

编辑:删除了mutable这个词,因为该行为也适用于immutables。