目次
1. Python の深いコピーと浅いコピーの概念
2. Python の深いコピーと浅いコピーの使用シナリオ
3. Python のディープ コピーとシャロー コピーに関する注意事項
4. Python の深いコピーと浅いコピーの実装
1. コピー モジュールを使用する
2. pickle モジュールを使用します
5. 概要
ホームページ バックエンド開発 Python チュートリアル Pythonにおける深いコピーと浅いコピーの用途と注意点は何ですか?

Pythonにおける深いコピーと浅いコピーの用途と注意点は何ですか?

May 31, 2023 am 08:05 AM
python

    1. Python の深いコピーと浅いコピーの概念

    Python では、代入操作が実行されると、オブジェクトへの参照が実際に変数に代入されます。したがって、これら 2 つの変数は同じオブジェクトを指します。オブジェクトをコピーする必要がある場合は、コピー操作を使用する必要があります。

    浅いコピーとは、新しいオブジェクトを作成し、元のオブジェクトの参照を新しいオブジェクトにコピーすることを指します。新しいオブジェクトは元のオブジェクトと同じメモリ アドレスを共有するため、一方のオブジェクトの値が変更されると、もう一方のオブジェクトの値も影響を受けます。浅いコピーでは、オブジェクトのコンテンツの 1 つのレイヤーのみがコピーされます。

    元のオブジェクトとそのサブオブジェクトのすべての内容を再帰的にコピーして、新しいオブジェクトを作成します。これがディープ コピーです。新しいオブジェクトは元のオブジェクトとメモリ アドレスを共有せず、完全に独立しているため、一方のオブジェクトの値を変更しても、もう一方のオブジェクトの値には影響しません。

    2. Python の深いコピーと浅いコピーの使用シナリオ

    浅いコピーは、リスト、タプル、辞書などの単純なオブジェクトのコピーなど、オブジェクト階層が浅い状況に適しています。オブジェクトの要素がすべて不変型である場合は、浅いコピーを使用してオブジェクトをコピーできます。

    ネストされたリストのリストやネストされた辞書の辞書など、オブジェクト階層が複雑な場合は、ディープ コピーが適切な選択です。オブジェクトの要素に変更可能なオブジェクトが含まれている場合、コピーが必要な場合はディープ コピーを使用する必要があります。

    3. Python のディープ コピーとシャロー コピーに関する注意事項

    • 不変オブジェクト (数値、文字列、タプルなど) の場合、シャロー コピーとディープ コピーは同じ 。

    • 浅いコピーでは、可変オブジェクト (リストや辞書など) のコンテンツの 1 レベルのみがコピーされますが、可変オブジェクトに含まれるサブオブジェクトは再帰的にコピーされません。サブオブジェクトを再帰的にコピーする必要がある場合は、ディープ コピーを使用する必要があります。

    • オブジェクトに循環参照が含まれている場合、ディープ コピーを試行すると無限再帰が発生し、プログラムがクラッシュする可能性があります。したがって、ディープ コピーを使用する場合は、循環参照を含むオブジェクトに注意する必要があります。

    • ディープ コピーを使用する場合、オブジェクトの階層構造が複雑な場合、パフォーマンス上の問題が発生する可能性があるため、ディープ コピーの使用には注意が必要です。

    4. Python の深いコピーと浅いコピーの実装

    Python では、深いコピーと浅いコピーを実装する 2 つの方法 (copy モジュールを使用する方法と pickle モジュールを使用する方法) を提供します。

    1. コピー モジュールを使用する

    Python のコピー モジュールには、シャロー コピーとディープ コピーという 2 つの機能があります。

    浅いコピーは、copy() 関数を使用して実装できます。例:

    import copy
    
    a = [1, 2, 3]
    b = copy.copy(a)
    print(b)  # [1, 2, 3]
    ログイン後にコピー

    ディープ コピーは、deepcopy() 関数を使用して実装できます。例:

    import copy
    
    a = [[1, 2], [3, 4]]
    b = copy.deepcopy(a)
    print(b)  # [[1, 2], [3, 4]]
    ログイン後にコピー

    2. pickle モジュールを使用します

    Python の pickle モジュールは、Python オブジェクトをバイト ストリームにシリアル化し、バイト ストリームを Python オブジェクトに逆シリアル化できます。 pickle モジュールを通じてディープコピーを実現できます。

    ディープ コピーは、pickle モジュールを使用して実装できます。例:

    import pickle
    
    a = [[1, 2], [3, 4]]
    b = pickle.loads(pickle.dumps(a))
    print(b)  # [[1, 2], [3, 4]]
    ログイン後にコピー

    pickle モジュールを使用してディープ コピーを実装すると、パフォーマンスの問題が発生する可能性があるため、注意が必要です。使用するとき。

    5. 概要

    Python のディープ コピーとシャロー コピーは非常に実用的な概念であり、ディープ コピーとシャロー コピーの使用シナリオと注意事項をマスターすると、オブジェクトのコピーと変更をより適切に処理できるようになります。深いコピーと浅いコピーを実装する場合、Python の copy モジュールと pickle モジュールを使用し、特定の状況に応じて適切な方法を選択できます。なお、ディープコピーを使用する場合、オブジェクト階層が複雑な場合、パフォーマンス上の問題が発生する可能性があるため、ディープコピーの使用には注意が必要です。開発プロセス中は、可能な限り浅いコピーを使用するように努め、必要な場合にのみ深いコピーの使用を検討する必要があります。

    さらに、ディープ コピーを使用する場合、オブジェクトの要素に可変オブジェクトが含まれる場合、循環参照を含むオブジェクトの処理に注意する必要があります。そうしないと、無限再帰に陥り、プログラムがクラッシュする可能性があります。

    つまり、深いコピーと浅いコピーは Python において非常に重要な概念です。深いコピーと浅いコピーの使用法と注意事項をマスターすることで、オブジェクトのコピーと変更をより適切に処理し、パフォーマンスと保守性を向上させることができます。プログラム。

    最後に、深いコピーと浅いコピーの使用方法を示す実際の例を見てみましょう。

    リストと辞書を含む複雑なオブジェクトがあり、それをコピーして変更する必要があるとします。以下はサンプル コードです。

    import copy
    
    # 定义一个包含列表和字典的复杂对象
    a = {
        "name": "Tom",
        "age": 18,
        "scores": [80, 90, 95],
        "info": {
            "address": "Beijing",
            "phone": "1234567890"
        }
    }
    
    # 浅拷贝
    b = copy.copy(a)
    b["name"] = "Jerry"
    b["scores"].append(100)
    b["info"]["address"] = "Shanghai"
    print(a)  # {'name': 'Tom', 'age': 18, 'scores': [80, 90, 95, 100], 'info': {'address': 'Shanghai', 'phone': '1234567890'}}
    print(b)  # {'name': 'Jerry', 'age': 18, 'scores': [80, 90, 95, 100], 'info': {'address': 'Shanghai', 'phone': '1234567890'}}
    
    # 深拷贝
    c = copy.deepcopy(a)
    c["name"] = "Lucy"
    c["scores"].append(99)
    c["info"]["address"] = "Guangzhou"
    print(a)  # {'name': 'Tom', 'age': 18, 'scores': [80, 90, 95, 100], 'info': {'address': 'Shanghai', 'phone': '1234567890'}}
    print(c)  # {'name': 'Lucy', 'age': 18, 'scores': [80, 90, 95, 100, 99], 'info': {'address': 'Guangzhou', 'phone': '1234567890'}}
    ログイン後にコピー

    上記のサンプル コードでは、まずリストと辞書を含む複合オブジェクト a を定義し、次にシャロー コピーとディープ コピーを使用してコピーおよび変更します。

    copy() 関数を呼び出してオブジェクト a の浅いコピーを作成すると、新しいオブジェクト b を取得できます。次に、新しいオブジェクト b の名前、スコア、情報のアドレス属性を変更し、元のオブジェクト a と新しいオブジェクト b の値を出力しました。元のオブジェクト a の値は変化していませんが、新しいオブジェクト b の値が変化していることがわかります。

    deepcopy() 関数を使用してオブジェクト a をディープコピーすると、新しいオブジェクト c を取得できます。次に、新しいオブジェクト c の名前、スコア、情報のアドレス属性を変更し、元のオブジェクト a と新しいオブジェクト c の値を出力しました。元のオブジェクト a の値は変化していませんが、新しいオブジェクト c の値が変化していることがわかります。

    上記のサンプル コードを通じて、深いコピーと浅いコピーは複雑なオブジェクトを扱うときに非常に便利で、オブジェクトのコピーと変更をより適切に処理するのに役立つことがわかります。実際の開発では、特定のシナリオに基づいて適切なコピー方法を選択し、可能な限り浅いコピーを使用し、必要な場合にのみ深いコピーを使用する必要があります。

    以上がPythonにおける深いコピーと浅いコピーの用途と注意点は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

    PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

    CentosでPytorchモデルを訓練する方法 CentosでPytorchモデルを訓練する方法 Apr 14, 2025 pm 03:03 PM

    CentOSシステムでのPytorchモデルの効率的なトレーニングには手順が必要であり、この記事では詳細なガイドが提供されます。 1。環境の準備:Pythonおよび依存関係のインストール:Centosシステムは通常Pythonをプリインストールしますが、バージョンは古い場合があります。 YumまたはDNFを使用してPython 3をインストールし、PIP:sudoyumupdatepython3(またはsudodnfupdatepython3)、pip3install-upgradepipをアップグレードすることをお勧めします。 cuda and cudnn(GPU加速):nvidiagpuを使用する場合は、cudatoolをインストールする必要があります

    CentosのPytorchのGPUサポートはどのようにサポートされていますか CentosのPytorchのGPUサポートはどのようにサポートされていますか Apr 14, 2025 pm 06:48 PM

    Pytorch GPUアクセラレーションを有効にすることで、CentOSシステムでは、PytorchのCUDA、CUDNN、およびGPUバージョンのインストールが必要です。次の手順では、プロセスをガイドします。CUDAおよびCUDNNのインストールでは、CUDAバージョンの互換性が決定されます。NVIDIA-SMIコマンドを使用して、NVIDIAグラフィックスカードでサポートされているCUDAバージョンを表示します。たとえば、MX450グラフィックカードはCUDA11.1以上をサポートする場合があります。 cudatoolkitのダウンロードとインストール:nvidiacudatoolkitの公式Webサイトにアクセスし、グラフィックカードでサポートされている最高のCUDAバージョンに従って、対応するバージョンをダウンロードしてインストールします。 cudnnライブラリをインストールする:

    Dockerの原則の詳細な説明 Dockerの原則の詳細な説明 Apr 14, 2025 pm 11:57 PM

    DockerはLinuxカーネル機能を使用して、効率的で孤立したアプリケーションランニング環境を提供します。その作業原則は次のとおりです。1。ミラーは、アプリケーションを実行するために必要なすべてを含む読み取り専用テンプレートとして使用されます。 2。ユニオンファイルシステム(UnionFS)は、違いを保存するだけで、スペースを節約し、高速化する複数のファイルシステムをスタックします。 3.デーモンはミラーとコンテナを管理し、クライアントはそれらをインタラクションに使用します。 4。名前空間とcgroupsは、コンテナの分離とリソースの制限を実装します。 5.複数のネットワークモードは、コンテナの相互接続をサポートします。これらのコア概念を理解することによってのみ、Dockerをよりよく利用できます。

    Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

    PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

    Centosの下でPytorchバージョンを選択する方法 Centosの下でPytorchバージョンを選択する方法 Apr 14, 2025 pm 02:51 PM

    CentOSでPytorchバージョンを選択する場合、次の重要な要素を考慮する必要があります。1。CUDAバージョンの互換性GPUサポート:NVIDIA GPUを使用してGPU加速度を活用したい場合は、対応するCUDAバージョンをサポートするPytorchを選択する必要があります。 NVIDIA-SMIコマンドを実行することでサポートされているCUDAバージョンを表示できます。 CPUバージョン:GPUをお持ちでない場合、またはGPUを使用したくない場合は、PytorchのCPUバージョンを選択できます。 2。PythonバージョンPytorch

    ミニオペンCentosの互換性 ミニオペンCentosの互換性 Apr 14, 2025 pm 05:45 PM

    MINIOオブジェクトストレージ:CENTOSシステムの下での高性能展開Minioは、Amazons3と互換性のあるGO言語に基づいて開発された高性能の分散オブジェクトストレージシステムです。 Java、Python、JavaScript、Goなど、さまざまなクライアント言語をサポートしています。この記事では、CentosシステムへのMinioのインストールと互換性を簡単に紹介します。 Centosバージョンの互換性Minioは、Centos7.9を含むがこれらに限定されない複数のCentosバージョンで検証されています。

    NginxをCentosにインストールする方法 NginxをCentosにインストールする方法 Apr 14, 2025 pm 08:06 PM

    NGINXのインストールをインストールするには、次の手順に従う必要があります。開発ツール、PCRE-Devel、OpenSSL-Develなどの依存関係のインストール。 nginxソースコードパッケージをダウンロードし、それを解凍してコンパイルしてインストールし、/usr/local/nginxとしてインストールパスを指定します。 nginxユーザーとユーザーグループを作成し、アクセス許可を設定します。構成ファイルnginx.confを変更し、リスニングポートとドメイン名/IPアドレスを構成します。 nginxサービスを開始します。依存関係の問題、ポート競合、構成ファイルエラーなど、一般的なエラーに注意する必要があります。パフォーマンスの最適化は、キャッシュをオンにしたり、ワーカープロセスの数を調整するなど、特定の状況に応じて調整する必要があります。

    See all articles