配列(リスト)をコピーしたいのですが?
できます。
が、しかしコピーには2種類あります。
コピー先 = コピー元
こういった形でコピーしたいとします。
この場合のコピーは「参照」となります。
具体的に言うと、コピー先で値を変更すると、コピー元もその変更が反映され、その逆もしかりです。
コピー元のエイリアスが「コピー先」という理解で良いと思います。
C言語では、アドレスとポインタと同じです。
そこで、コピー元とは別に新規に複写してコピー先を作りたい場合、Pythonではcopy()
を使います。
コピー先 コピー元
B_value = A_value.copy()
こうすることによって、コピー元とはまったく別に複写したコピー先の配列(リスト)が生成されます。
コピー先の配列データを変更しても、元の配列データには一切影響はありません。
こうしたコピーと参照をうまく使い分けてプログラミングができるとレベルが上がるというものです。
とはなりません
とはならないのです。そんな簡単な話ではありません。
A_value=B_value
は参照
A_value=B_value.copy()
は正確には「浅いコピー」となり、とうぜん「深いコピー」が存在します。
・浅いコピー shallow copy
・深いコピー deep copy
違いをわかりやすくします。
import copy
l = [0, 1, [2, 3]]
l_assign = l # assignment
l_copy = l.copy() # shallow copy
l_deepcopy = copy.deepcopy(l) # deep copy
l[1] = 100
l[2][0] = 200
print(l)
# [0, 100, [200, 3]]
print(l_assign)
# [0, 100, [200, 3]]
print(l_copy)
# [0, 1, [200, 3]]
print(l_deepcopy)
# [0, 1, [2, 3]]
普通は、「浅いコピー」で問題ないと思います。
通常、浅いコピーが一般的です。が、配列の中にオブジェクトがある場合は、copy()
しても配列の中のオブジェクトは、「参照」をcopy()
します(ここが大問題)
ですので、配列の中にオブジェクトがない場合は普通にcopy()
で大丈夫なのです。
逆に、参照関係で、一方で値を変更したら、その変更が反映されたい。
という場合は、A_value=B_value
で良いですね。