2016-11-02 6 views
3

プログラムでエラーが発生した理由を理解するには、変数のメルトアップが原因で単純なプログラムを書きました。この関数は2 * 2の行列を入力として取り込み、その行を含むリストを返します(無意味で非効率的ですが、私はこの背後にある理論を理解しようとしています)。値リストでリストをコピーして参照なしでコピーする

def alpha(A): #where A will be a 2 * 2 matrix 
    B = A  #the only purpose of B is to store the initial value of A, to retrieve it later 
    mylist = [] 
    for i in range(2): 
     for j in range(2): 
      del A[i][j] 
     array.append(A) 
     A = B 
    return mylist 

しかし、ここでは、Bが、私はそれを後で使用するためにBにAの初期値を格納することはできませんよという意味で、動的にの値が割り当てられているようです。何故ですか? Pythonは参照 でリストを渡しているので

+1

'array.append(A)は'本当に 'マイリストであるべき。 (A) 'を付ける?そうでない場合、 'array'はどこに定義されていますか? – CDspace

+1

"array"が追加したい実際の配列、つまりその配列に対応する変数であり、 "array"パッケージではないことを考慮せずに、ドキュメントからarray.append(A)をコピーしました。申し訳ありませんが私はsometihngを逃した? –

+0

[Pythonの参照渡し](http://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/)かなり視覚化のための – dangom

答えて

7

は、これは、あなたが言っている「B =」書くときには、AとBが同じオブジェクトであり、あなたも変更bのことは、あなたが変更されたとき、およびその逆

ことを意味します

値でリストをコピーする方法:リストオブジェクトが含まれており、同様にそれらをコピーしたい場合は

new_list = old_list[:] 

は、一般的なcopy.deepcopyを使用し():

import copy 
new_list = copy.deepcopy(old_list) 
+1

あなたは 'deepcopy'を作成しなければなりません。あなたは' deepcopy'を作成する必要があります。 '' deepcopy''を '' deepcopy''で作成する必要があります。彼らはリストのリストを持っているので、この場合。 –

2

Aは参照型のように見えますが、値型ではありません。参照型は代入時にコピーされません(例えばRとは異なります)。 copy.copyを使用して要素のディープコピーを作成することができます

2

Pythonはリストを参照渡しするので、ABは同じオブジェクトです。 Bを変更すると、Aも変更されます。この動作は単純な例で実証することができます。

>>> A = [1, 2, 3] 
>>> def change(l): 
...  b = l 
...  b.append(4) 
... 
>>> A 
[1, 2, 3] 
>>> change(A) 
>>> A 
[1, 2, 3, 4] 
>>> 

あなたはA使用スライス表記のコピーが必要な場合:

B = A[:]

関連する問題