pythonでのオブジェクトコピーの例pythonリファレンス転送

2266 ワード

リファレンス伝達とは、C++交換の2つの数の関数を見てみましょう.
 
  
void swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

この例は引用伝達の例です!目的は概念を説明することです:引用伝達の意味はあなたが伝達したのはオブジェクトの引用で、この引用に対する修正も元のオブジェクトの変化を招きます.C/C++を学んだ友人たちは、2つの数を交換するときに、自分でswap関数を実現するには、その参照やポインタを渡す必要があることを知っています.
Pythonは直接引用伝達を使って、どんなに便利ですか.何をツッコミますか.私が元の相手を変えたくないと思ったことはありますか?もしあったら、ここを見て!
もし私が今listを持っていて、l 1と呼ばれています.私は今l 1のコピーが必要です.もし私が直接l 2=l 1のような方法を使って、それからl 2に対して一連の修正を行ったら、私がl 1に対して直接修正するのと同じです.これは私が望んでいるものではありません.次のようになります.
 
  
l1 = [1, 2]
l2 = l1
l2.append(3)
print l1
print l2
# l1 = [1, 2, 3], l2 = [1, 2, 3]

これがPythonリファレンス伝達によるものであり,l 1とl 2が同じリストオブジェクトに属するとしたら,どのようにして異なるオブジェクトを得ることができるのだろうか.これはso easyではありませんか.スライスで撒きます.例えば、
 
  
l1 = [1, 2]
l2 = l1[:]
l2.append(3)
# l1 = [1, 2], l2 = [1, 2, 3]

はい、目的が達成されました.気にしないでください.本当にそうすればいいですか.もっと複雑な状況を見てみましょう
 
  
l1 = [[1, 2], 3]
l2 = l1[:]
l2.append(4)
# l1 = [[1, 2], 3], l2 = [[1, 2], 3, 4]
l2[0].append(5)
# l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4]

ああ、問題があったようですね.これは私たちが必要としているものではありません.どうしようかな?さて、今日の本題、Pythonのcopyモジュールに入ります!
 
  
import copy

コンテナオブジェクトとその中のすべての要素(要素を含むサブ要素)をコピーする場合は、copyを使用します.deepcopy、この方法は時間と空間を消費しますが、完全にコピーする必要がある場合は、これが唯一の方法です.上述したスライスの方式は,copyモジュールにおけるcopy関数に等価である.
上のコピーの操作はso easyになりました.
 
  
l1 = [[1, 2], 3]
l2 = copy.copy(l1)
l3 = copy.deepcopy(l1)
l2.append(4)
l2[0].append(5)
l3[0].append(6)
# l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4], l3 = [[1, 2, 6], 3]

関連説明:
 
  
copy(x)
    Shallow copy operation on arbitrary Python objects.
    See the module's __doc__ string for more info.
deepcopy(x, memo=None, _nil=[])
    Deep copy operation on arbitrary Python objects.
    See the module's __doc__ string for more info.