关于numpy:python中变量定义的意外行为

unexpected behaviour with variables definition in python

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Variable assignment and modification (in python)

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

1
2
3
4
5
6
7
8
9
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终端中重现意想不到的结果。我在Scite 3.1.0中使用f5键运行代码得到了这个结果。我在Win7中使用的是python(x,y)2.7.2.3发行版。


1
B = A

使AB指向同一对象。这就是为什么它们会同时改变。

使用

1
B = A.copy()

它会像期待的那样工作。


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

但是,这种情况也会发生在可变容器上,如列表或字典。为了避免这种情况,您可以使用以下方法之一:(取决于变量的复杂性)

1
2
3
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导入它们。

另见:这个问题