ホームページ  >  記事  >  バックエンド開発  >  Python の面接でよくある質問: 浅いコピーと深いコピー

Python の面接でよくある質問: 浅いコピーと深いコピー

WBOY
WBOY転載
2023-04-12 11:37:051708ブラウズ

Python の面接でよくある質問: 浅いコピーと深いコピー

Python の面接では、シャロー コピーとディープ コピーは比較的難しい質問です。60 パーセントの人はシャロー コピーとディープ コピーについて聞いたことがなく、30 パーセントの人は基本的なことしか理解していませんコンセプトとシンプルさの違い。 2 つの違いを正確に見分けて、関連するコード デモの作成を完了できる大人は 1 人未満です。今日はこの悩みを解決して、面接に昇進の重みを加えていきましょう!この記事は、シャロー コピーとディープ コピーについて説明したインターネット上で最もわかりやすい記事と思われます。記事の例に従って実践していただければ、シャロー コピーとディープ コピーの技術的な難しさは必ず理解できるでしょう。コピーは!

変数の割り当て

Python 変数データ型 (リスト、ディクショナリ、セット) では、変数データ型の変数を別の変数に割り当てます。2 つの変数は、同じオブジェクトには同じものがあります。メモリ アドレス。1 つの変数が変更されると、それに応じて他の変数も変更されます。 Python の可変データ型と不変データ型の技術的な詳細について知りたい場合は、次の記事を参照してください: Python インタビューでよくある質問: 可変データ型と不変データ型の違い。

前回の記事から例を見てみましょう。

l1=['a','b','c']
l2=l1
print(id(l1))
print(id(l2))
l2.append('d')
print("************")
print(id(l1))
print(l1)
print(id(l2))
print(l2)
输出:
838366483528
838366483528
************
838366483528
['a', 'b', 'c', 'd']
838366483528
['a', 'b', 'c', 'd']

出力結果についてはここでは説明しませんが、l1とl2のアドレスは同じなので相互に影響します。

浅いコピー

オブジェクトの最上位をコピーし、オブジェクトの「参照」のみをコピーします。

前の記事の例を見てみましょう。リストにはレイヤーが 1 つだけあります。つまり、要素には他のリストが含まれません。

l3=['x','y','z']
l4=list(l3)
print(id(l3))
print(id(l4))
l4.append('a')
print(l3)
print(l4)
输出
831456302152
831480344136
['x', 'y', 'z']
['x', 'y', 'z', 'a']

結果からわかるように、l3 と l4 のアドレスは異なるため、相互に影響しません。

別の例を取り上げて、l3 の最初の要素をリストにしてみましょう。

l3=[['x','y','z'],'a','b']
l4=list(l3)
print(id(l3))
print(id(l4))
l4.append('c')
print(l3)
print(l4)
结果
533336249416
533337391240
[['x', 'y', 'z'], 'a', 'b']
[['x', 'y', 'z'], 'a', 'b', 'c']

結果は予想どおりです。最初の要素はリストなのでアドレスもあり、それを出力します。

print(id(l3[0]))
print(id(l4[0]))
结果
533336248904
533336248904

l3[0] と l4[0] のアドレスが実際には同じであることがわかり、次のコードを実行します。

l3[0].append('yy')
print(l3)
print(l4)
结果
[['x', 'y', 'z', 'yy'], 'a', 'b']
[['x', 'y', 'z', 'yy'], 'a', 'b', 'c']

結果は期待どおりであり、l3[0] の値を変更すると l4[0] にも影響します。では、l3[0] と l4[0] が相互に影響を与えないようにするにはどうすればよいでしょうか? これには、ディープ コピーの導入が必要です。

ディープ コピー

ディープ コピーでは、オブジェクト内の各レイヤーがコピーされます。コピーされたオブジェクトは、元のオブジェクトから完全に独立しており、関係はありません。ディープ コピーを実装するには、コピー モジュールで deepcopy メソッドを使用する必要があります。

import copy
l3=[['x','y','z'],'a','b']
#l4=list(l3) #浅拷贝,使用=copy.copy(l3)也可以实现浅拷贝
l4=copy.deepcopy(l3) #深拷贝
l4.append('c')
print(id(l3[0]))
print(id(l4[0]))
l3[0].append('yy')
print(l3)
print(l4)
输出
407168435784
407166887304
[['x', 'y', 'z', 'yy'], 'a', 'b']
[['x', 'y', 'z'], 'a', 'b', 'c']

l3[0] と l4[0] は完全に独立しており、互いに影響を与えていないことがわかります。

シャロー コピーとディープ コピーの概要

多くを語る必要はありません。2 枚の図を使って簡単に説明します。

シャロー コピーは次のとおりです。

Python の面接でよくある質問: 浅いコピーと深いコピー

以下に示すディープ コピー:


Python の面接でよくある質問: 浅いコピーと深いコピー

以上がPython の面接でよくある質問: 浅いコピーと深いコピーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。