1

可能重复:
变量赋值和修改(在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 = A”替换为“B = np.zeros([1, 3])”,那么我做对了。我无法在 Ipython 终端中重现意外结果。我在 SciTE 3.1.0 中使用 F5 键运行代码得到了该结果。我在 Win7 中使用 Python(x, y) 2.7.2.3 发行版。

4

2 回答 2

2
B = A

生成并指向同一个对象AB这就是为什么它们将同时更改。

采用

B = A.copy()

它将按预期工作。

于 2013-01-09T10:24:02.660 回答
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

另见:这个问题

于 2013-01-09T10:27:08.003 回答