这是最小的代码:
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
的新值?这背后的机制是什么,知道为什么/何时会发生这种情况的一般规则是什么?这似乎有点危险......
答案 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。