ディープコピーとシャローコピーは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 に従ってください)