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 ターミナルで予期しない結果を再現できません。F5 キーを使用してコードを実行することで、SciTE 3.1.0 でその結果が得られました。Win7 で Python(x, y) 2.7.2.3 ディストリビューションを使用しています。

4

2 に答える 2

2
B = A

同じオブジェクトを作成Aし、Bポイントします。そのため、それらは同時に変更されます。

使用する

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

copyおよびdeepcopy関数を使用するには、標準モジュールからインポートする必要があることに注意してくださいcopy

参照:この質問

于 2013-01-09T10:27:08.003 に答える