Python Numpy变量赋值是通过引用进行的?

Python Numpy变量赋值是通过引用进行的?,python,numpy,reference,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的新值?这背后的机制是什么?知道为什么/何时会发生这种情况的一般规则是什么?这似乎有点危险…这是一般的python行为,而不是特定于numpy。如果您有一个对象,例如list,您将看到类似的行为 a = [1] b = a b[0

以下是最基本的代码:

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
的新值?这背后的机制是什么?知道为什么/何时会发生这种情况的一般规则是什么?这似乎有点危险…

这是一般的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,因为该行为也适用于不可变

Python赋值的工作方式可能与此重复
A=B
仅表示“名称A所指的对象现在也被名称B所指”。同样,这很容易记住,它总是这样工作的。参见
A
B
参考相同的支持数据。实际上,在这种情况下,它更强大:它们指的是同一个对象@Thierrylahuille稍作阐述,这是一个关于评估策略的问题。在这个问题上,问题是任务是如何工作的。然而,在Python中,参数传递在语义上等同于赋值!对于numpy数组,添加了一层“查看”与“复制”:。注意,使用不可变对象也可以看到这种行为
a=(1,2,3)
然后
a=b
然后
打印(id(a),id(b))
是的,这也适用于不可变项。