ホームページ  >  記事  >  バックエンド開発  >  Pythonの代入&浅いコピー&深いコピーの簡単な紹介(例)

Pythonの代入&浅いコピー&深いコピーの簡単な紹介(例)

不言
不言オリジナル
2018-08-30 10:11:401270ブラウズ

この記事では、Python の代入、浅いコピー、深いコピーについて簡単に紹介 (例) します。一定の参考価値があります。必要な友人は参照してください。お役に立てれば幸いです。

dict データ型を記述するときに、「代入ステートメント」と copy() 関数について説明しました。
実際、深いコピーと浅いコピーに関しては、特定のデータ タイプを考慮する必要があります。 1 つの部分は数値や文字列などの不変オブジェクトであり、もう 1 つの部分はリストや辞書などの変更可能なオブジェクトです。

1. 定義の説明

  • 変数: オブジェクトの接続スペースを指すシステム テーブルの要素。

  • オブジェクト: 実際の値を保存するために割り当てられたメモリの一部。

  • 参照: 変数からオブジェクトへのポインタ。

  • 不変オブジェクト: 数値、文字列、タプルなどは、一度作成すると変更できません。

  • 変数オブジェクト: リストや辞書など、変更できるオブジェクト。

  • 割り当て: ステートメント「=」によって達成されます。左側は新しく作成された変数で、右側は直接の内容または既存の変数になります。これはオブジェクトへの参照です。Python はオブジェクトをコピーしませんが、オブジェクトへの参照のみをコピーします。新しい変数はソース変数のメモリ アドレスを指します。

  • 浅いコピー: オブジェクトをコピーします。最も外側のオブジェクト自体がコピーされ、内部要素は参照付きでコピーされるだけです。つまり、元のオブジェクトと同じ型で、内容が元のオブジェクトへの参照である新しいオブジェクトが作成されます。 [浅いコピー オブジェクトは新しく、オブジェクトの参照内容は古い。 ]
    浅いコピーを実装するいくつかの方法: (1) スライス: [:]; (2) list()、dict() などのファクトリ関数; (3) copy() を使用します。

  • ディープ コピー: 周辺要素と内部要素の両方が、参照ではなくオブジェクト自体をコピーします。つまり、オブジェクトが一度コピーされると、そのオブジェクト内で参照されている他のオブジェクトもコピーされます。

2. 不変オブジェクト

数値や文字列などの不変オブジェクトの場合、代入 (=)、浅いコピー (違いはありません) copy()) と deepcopy() の間では、それらのオブジェクト参照は常に同じメモリ アドレスを指しているためです。
例によるデモ:

>>> var_1 = 123
>>> id(var_1)            # 通过id()查看地址
1615552144
>>> var_2 = var_1
>>> id(var_2)
1615552144
>>>
>>> import copy        # 浅、深拷贝需要导入copy模块
>>> var_3 = copy.copy(var_1)
>>> id(var_3)
1615552144
>>>
>>> var_4 = copy.deepcopy(var_1)
>>> id(var_4)
1615552144

var_1 ~ var_4 の id ポイントが同じであることがわかります。

3. 変数オブジェクト

リスト、辞書、その他のデータ型の場合、代入、浅いコピー、深いコピーではメモリ アドレスの変更が異なります。
割り当ての浅いコピー: 等しい値、等しいアドレス;
コピーの浅いコピー: 等しい値、異なるアドレス;
深いコピーの深いコピー:値は等しいが、アドレスは等しくない;

例 1:
base[0]='name'、これは文字列の不変オブジェクトです。 Base[1]=[ 'age',18] はリストであり、変更可能なオブジェクトです。
base_1 とbase_2 は両方とも Base の浅いコピーであり、3 つは同じ id() を持ちます。
最初の文字列要素に異なる変更が加えられた場合、文字列 (不変) がコピーされて表示され、変更されると新しい文字オブジェクトが作成されるため、ID は異なり、相互に影響を及ぼさないことがわかります。
2 番目のリスト要素を変更する場合、2 番目の要素リストはその参照をコピーするだけであるため、異なる変更は最後の変更にのみ適用され、相互に影響します。浅いコピーを変更すると、参照が変更されます。

Pythonの代入&浅いコピー&深いコピーの簡単な紹介(例)

#例 2: ディープ コピー辞書オブジェクトを作成し、ディープ コピーを使用して新しいオブジェクトを作成します。

>>>import copy
>>> var = {"a":1,"b":2,"c":[3,'abc']}
>>> var1 = copy.deepcopy(var)
>>> id(var),id(var1)
(17616992, 15671136)            # 地址不相同
>>> id(var['c']),id(var1['c'])
(15695144, 15695384)        
>>> id(var['c'][0]),id(var1['c'][0])
(1615550224, 1615550224)        # ‘c’元素的内存地址是相同的
>>>
>>> var1['c'][0] = 4
>>> var
{'a': 1, 'b': 2, 'c': [3, 'abc']}
>>> var1
{'a': 1, 'b': 2, 'c': [4, 'abc']}
>>> id(var['c'][0]),id(var1['c'][0])
(1615550224, 1615550240)        # 对var1的修改没有影响var
関連する推奨事項:

Python での代入演算子の整理

Python での代入、浅いコピー、深いコピー コピーの概要

以上がPythonの代入&浅いコピー&深いコピーの簡単な紹介(例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。