ホームページ >バックエンド開発 >Python チュートリアル >Python でのオブジェクトのコピー
オブジェクトをコピーしますか? Python では、オブジェクトをパラメータとして渡すか、関数の戻り値として渡すかにかかわらず、オブジェクトは参照によって渡されるためです。
参照渡しとは何ですか? 2 つの数値を交換する C++ 関数を見てみましょう:
void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; }
この例は参照渡しの例です。目的は概念を説明することです。参照による受け渡しとは、渡すものがオブジェクトへの参照であり、この参照を変更すると元のオブジェクトも変更されることを意味します。 C/C++ を勉強したことのある友人は皆、2 つの数値を交換するときに、スワップ関数を自分で実装する場合は、その参照またはポインターを渡す必要があることを知っています。
Python は参照の直接受け渡しを使用します。これがいかに便利か、他に何を不満に思いますか?元のオブジェクトを変更したくない状況について考えたことがありますか?もしそうなら、ここを見てください!
l1 というリストがあり、l1 のコピーが必要になったとします。 l2 = l1 などのメソッドを直接使用して、l2 に一連の変更を加えると、それは直接私と同等になります。 l1 を変更することは私が望んでいることではありません。例:
l1 = [1, 2] l2 = l1 l2.append(3) print l1 print l2 # l1 = [1, 2, 3], l2 = [1, 2, 3]
これは Python 参照の受け渡しによって発生します。これは、l1 と l2 が同じリスト オブジェクトに属していることを意味します。では、どうすれば異なるオブジェクトを取得できるでしょうか?これはとても簡単ではありませんか? たとえば、スライスして散りばめます:
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 モジュールにいきましょう。
インポートコピー
コンテナオブジェクトとその中のすべての要素 (要素の子要素を含む) をコピーしたい場合は、このメソッドは時間とスペースを消費します。完全にコピーします。これが唯一の方法です。上で説明したスライス方法は、コピー モジュールのコピー機能に相当します。
上記のコピー操作は非常に簡単になりました:
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)
任意の Python オブジェクトに対する浅いコピー操作。
詳細については、モジュールの __doc__ 文字列を参照してください。
deepcopy(x, memo=None, _nil=[])
任意の Python オブジェクトに対するディープ コピー操作
詳細については、モジュールの __doc__ 文字列を参照してください。