web-dev-qa-db-ja.com

参照ではなく値でリストのリストをコピーする

行列式の「マイナー」を見つけようとしたプログラムでエラーが発生した理由を理解するために、変数がめちゃくちゃになったため、より単純なプログラムを作成しました。以下のこの関数は、入力として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にAの値が割り当てられているようです(動的)。後で使用するためにAの初期値をBに格納できないという意味です。何故ですか?

7
Sphener

pythonは参照によってリストを渡すため

これは、 "b = a"と書いた場合、aとbは同じオブジェクトであり、bを変更するとaも変更することを意味します。逆も同様です。

リストを値でコピーする方法:

new_list = old_list[:]

リストにオブジェクトが含まれていて、それらもコピーする場合は、一般的なcopy.deepcopy()を使用します。

import copy
new_list = copy.deepcopy(old_list)
13
Nikaido

Aは、値型ではなく、参照型のように見えます。参照タイプは割り当て時にコピーされません(Rなどとは異なります)。 copy.copyを使用して、要素のディープコピーを作成できます

2
Christian Sauer

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[:]

2
Christian Dean