行列式の「マイナー」を見つけようとしたプログラムでエラーが発生した理由を理解するために、変数がめちゃくちゃになったため、より単純なプログラムを作成しました。以下のこの関数は、入力として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に格納できないという意味です。何故ですか?
pythonは参照によってリストを渡すため
これは、 "b = a"と書いた場合、aとbは同じオブジェクトであり、bを変更するとaも変更することを意味します。逆も同様です。
リストを値でコピーする方法:
new_list = old_list[:]
リストにオブジェクトが含まれていて、それらもコピーする場合は、一般的なcopy.deepcopy()を使用します。
import copy
new_list = copy.deepcopy(old_list)
Aは、値型ではなく、参照型のように見えます。参照タイプは割り当て時にコピーされません(Rなどとは異なります)。 copy.copyを使用して、要素のディープコピーを作成できます
Pythonは参照によってリストを渡すため、A
とB
は同じオブジェクトです。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[:]