【Python】pythonのディープコピーとシャローコピーを詳しく解説(マスター必須)


ディープコピーとシャローコピーはpythonが身につけなければならない内容 開発、テスト、運用、保守の職種の面接を問わず、pythonであればディープコピーとシャローコピーは面接官からよく聞かれる重要な知識ポイントです。

(より多くの学習コンテンツについては、「テスト開発の自動化」Gong Zhonghao に従ってください)



1. ディープ コピーとシャロー コピーの類似点と相違点

同じ点:

ディープ コピーとシャロー コピーの両方で、新しいオブジェクトが作成されます。つまり、コピーされたオブジェクトの ID が異なります。

違い:

浅いコピー: オブジェクトのみがコピーされ、オブジェクト内の要素はコピーされません。
ディープ コピー: オブジェクトがコピーされるだけでなく、オブジェクト内の要素もコピーされます。


二、浅いコピー

2.1 浅いコピーの例

浅いコピーの例を見てみましょう。


import copy
a = [1, 2, [3, 4]]       
b = copy.copy(a)    # 浅拷贝
print(id(a))        # 输出结果:2401212115720
print(id(b))        # 输出结果:2401212116104

print(id(a[2]))     # 输出结果:1508928560
print(id(b[2]))     # 输出结果:1508928560

コードの説明:
1) b が a を浅くコピーした後、a オブジェクトと b オブジェクトの id は異なります (同じ点で一貫しています)
2) a と b の 3 番目の要素の id をそれぞれ取得します (3 番目の要素は可変オブジェクトです) 、 a と b の 3 番目の要素の id 値が同じであることがわかります。これは、要素の id がコピーされていないことを意味します。つまり、a と b 内の要素の id は同じです。(シャローコピーの違いと一致)

2.2 シャローコピーモディファイ要素の値

前述のように、オブジェクト a と b 内の要素 ID は同じです。つまり、オブジェクト a と b 内の要素は同じものです。
★注意点★:ただし、シャローコピーで a の要素の値が変更されるわけではなく、変更された値が変更可能なオブジェクトであるかどうかによって、b の要素の値が確実に変更されます。

[ケース 1]: 変更された要素が可変オブジェクトの場合、a の要素が変更され、b の要素が変更され、a と b の要素の id は変更されません。[ケース 2]: If
The変更された要素は不変オブジェクトであるため、a の要素が変更された場合、b の要素は変更されませんが、a と b の要素の id は変更されます。


# 情况1举例:修改的元素是可变对象
import copy
a = [1, 2, [3, 4]] 
b = copy.copy(a)     # 浅拷贝

a[2][1] = 4          # 修改a中[3, 4]元素,将3修改为4
print(a)             # 打印结果:[1, 2, [3, 4]]
print(b)             # 打印结果:[1, 2, [3, 4]]
print(id(a[2]))      # 打印结果:2561215900424
print(id(b[2]))      # 打印结果:2561215900424

コードの説明:
a の要素 [3, 4] は変更可能なオブジェクトであるため、要素 a が変更されると、要素 b も同期的に変更されますが、浅いコピーであるため、a およびb は変更されません。


# 情况2举例:修改的元素是不可变对象
import copy
a = [1, 2, [3, 4]]   
b = copy.copy(a)      # 浅拷贝

a[1] = 4              # 修改a中第1个位置上的元素,即将2修改为4
print(a)              # 打印结果:[1, 4, [3, 4]]
print(b)              # 打印结果:[1, 2, [3, 4]]
print(id(a[1]))       # 打印结果:1508928624
print(id(b[1]))       # 打印结果:1508928560

コードの説明:
a要素の最初の要素は数値型(int型)であり、不変オブジェクトであるため、a要素が変更されてもbは変化せず、aとbの最初の位置の要素が属しますto two 2 つの異なるものがある場合、a と b の id は当然等しくありません。


3.ディープコピー

3.1 ディープコピーの例


import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a)    # 深拷贝

print(id(a))            # 输出结果:2034433010824
print(id(b))            # 输出结果:2034433010248

print(id(a[2]))         # 输出结果:2463430159112
print(id(b[2]))         # 输出结果:2463430154184

コードの説明:
1) b が a を浅くコピーした後、a オブジェクトと b オブジェクトの id は異なります (2.1 の同じ点と一致します)
2) a と b の 3 番目の要素の id をそれぞれ取得します (3 番目の要素は変数です) object )、a と b の 3 番目の要素の id 値が異なることがわかります。a が要素 b をコピーしていること、つまり a と b 内の要素 id が異なる個体であることを示しています。(ディープコピーの違いと一致)

3.2 ディープコピー修正値

浅いコピーとは対照的に、ディープ コピーも次の 2 つのケースに分けることができます。

[ケース 1]: 変更された要素が変数オブジェクトの場合、a の要素が変更され、b の要素は変更されず、a と b の要素の id が変更されます; [ケース 2]: If
The変更された要素は不変オブジェクトであるため、a の要素が変更された場合、b の要素は変更されませんが、a と b の要素の id が変更されます (シャロー コピーと同じ)。


# 情况1举例:修改的元素是可变对象
import copy
a = [1, 2, [3, 4]] 
b = copy.deepcopy(a)     # 浅拷贝

a[2][1] = 4          # 修改a中[3, 4]元素,将3修改为4
print(a)             # 打印结果:[1, 2, [3, 4]]
print(b)             # 打印结果:[1, 2, [3, 4]]
print(id(a[2]))      # 打印结果:1975929744136
print(id(b[2]))      # 打印结果:1975929739208

コードの説明:
a の要素 [3, 4] は変更可能なオブジェクトであり、ディープ コピーであるため、a 要素が変更された場合、b 要素は同期的に変更されません。これはディープ コピーであるため、a の可変オブジェクト要素を変更しても、b の要素の ID は変更されません。


いいね+フォロー+コレクト大歓迎

(より多くの学習コンテンツについては、「テスト開発の自動化」Gong Zhonghao に従ってください)

写真の説明を追加してください

おすすめ

転載: blog.csdn.net/weixin_44244190/article/details/129249875