python中变量定义的意外行为

时间:2013-01-09 10:16:22

标签: python numpy

  

可能重复:
  Variable assignment and modification (in python)

我刚注意到python中的变量赋值有一些我没想到的行为。例如:

import numpy as np
A = np.zeros([1, 3])
B = A

for ind in range(A.shape[1]):
    A[:, ind] = ind
    B[:, ind] = 2 * ind
print 'A = ', A
print 'B = ', B

输出

A = [[0. 2. 4。]]

B = [[0. 2. 4。]]

虽然我在期待:

A = [[0. 1. 2。]]

B = [[0. 2. 4。]]

如果我用“B = np.zeros([1,3])”替换“B = A”,那么我就是正确的。 我无法在Ipython终端中重现意外结果。我使用F5键在SciTE 3.1.0中得到了这个结果来运行代码。我在Win7中使用Python(x,y)2.7.2.3发行版。

2 个答案:

答案 0 :(得分:2)

B = A

使AB指向同一个对象。这就是他们同时改变的原因。

使用

B = A.copy()

它会等待。

答案 1 :(得分:1)

在您的代码中,B只是A的另一个名称,因此当您更改其中一个时,您将更改另一个名称。这是Python中可变对象的常见“问题”。使用numpy数组,您可以使用copy()函数。

但是,这也适用于可变容器,例如列表或词典。为避免这种情况,您可以使用以下方法之一:(取决于可变性的复杂性)

B = A[:]  #makes a copy of only the first level of the mutable
B = copy(A)  #same as above, returns a 'shallow copy' of A
B = deepcopy(A)  #copies every element in the mutable, on every level

请注意,要使用copydeepcopy函数,您需要从标准模块copy导入它们。

另请参阅:this question