Rumah >pembangunan bahagian belakang >Tutorial Python >Apakah kegunaan dan langkah berjaga-jaga penyalinan dalam dan cetek dalam Python?

Apakah kegunaan dan langkah berjaga-jaga penyalinan dalam dan cetek dalam Python?

王林
王林ke hadapan
2023-05-31 08:05:351858semak imbas

    1 Konsep salinan dalam dan cetek Python

    Dalam Python, apabila operasi tugasan dilakukan, rujukan kepada objek sebenarnya ditetapkan kepada pembolehubah. . , jadi kedua-dua pembolehubah ini menunjuk ke objek yang sama. Jika kita perlu menyalin objek, kita perlu menggunakan operasi salin.

    Shallow Copy merujuk kepada mencipta objek baharu dan kemudian menyalin rujukan objek asal kepada objek baharu. Oleh kerana objek baharu berkongsi alamat memori yang sama dengan objek asal, apabila nilai satu objek diubah suai, nilai objek lain turut terjejas. Salinan cetek hanya menyalin satu lapisan kandungan objek.

    Salin secara rekursif semua kandungan objek asal dan sub-objeknya untuk mencipta objek baharu Ini ialah Salinan Dalam. Oleh kerana objek baharu tidak berkongsi alamat memori dengan objek asal, objek tersebut adalah bebas sepenuhnya, jadi menukar nilai satu objek tidak menjejaskan nilai objek lain.

    2. Senario penggunaan salinan dalam dan cetek Python

    Salinan cetek sesuai untuk situasi di mana hierarki objek adalah cetek, seperti penyalinan objek mudah seperti senarai, tupel dan kamus. Jika unsur-unsur objek adalah semua jenis tidak berubah, anda boleh menggunakan salinan cetek untuk menyalin objek.

    Jika hierarki objek adalah kompleks, seperti senarai senarai bersarang atau kamus kamus bersarang, maka penyalinan dalam ialah pilihan yang sesuai. Jika elemen objek mengandungi objek boleh ubah, salinan dalam mesti digunakan apabila salinan diperlukan.

    3. Nota mengenai salinan dalam dan cetek Python

    • Untuk objek tidak berubah (seperti nombor, rentetan, tupel, dll.), salinan cetek dan salinan dalam adalah sama .

    • Salinan cetek hanya akan menyalin satu tahap kandungan objek boleh ubah (seperti senarai dan kamus), tetapi tidak akan menyalin sub-objek yang terkandung dalam objek boleh ubah secara rekursif. Jika anda perlu menyalin sub-objek secara rekursif, anda mesti menggunakan salinan dalam.

    • Apabila objek mengandungi rujukan bulat, mencuba salinan dalam boleh mengakibatkan rekursi tak terhingga, menyebabkan program ranap. Oleh itu, anda mesti berhati-hati dengan objek yang mengandungi rujukan bulat apabila menggunakan salinan dalam.

    • Apabila menggunakan salinan dalam, jika struktur hierarki objek adalah kompleks, ia mungkin menyebabkan masalah prestasi, jadi salinan dalam mesti digunakan dengan berhati-hati.

    4 Pelaksanaan salinan dalam dan cetek Python

    Python menyediakan dua cara untuk melaksanakan salinan mendalam dan cetek: menggunakan modul salinan dan menggunakan modul jeruk.

    1 Gunakan modul salinan

    Modul salinan dalam Python menyediakan dua fungsi, iaitu salinan cetek dan salinan dalam.

    Salinan cetek boleh dilaksanakan menggunakan fungsi copy(), contohnya:

    import copy
    
    a = [1, 2, 3]
    b = copy.copy(a)
    print(b)  # [1, 2, 3]

    Deep copy boleh dilaksanakan menggunakan fungsi deepcopy(), contohnya:

    import copy
    
    a = [[1, 2], [3, 4]]
    b = copy.deepcopy(a)
    print(b)  # [[1, 2], [3, 4]]

    2. Gunakan modul pickle

    Modul pickle dalam Python boleh mensirikan objek Python ke dalam strim bait dan menyahsiri strim bait ke dalam objek Python. Melalui modul jeruk, salinan mendalam boleh dicapai.

    Salinan mendalam boleh dilaksanakan menggunakan modul jeruk, contohnya:

    import pickle
    
    a = [[1, 2], [3, 4]]
    b = pickle.loads(pickle.dumps(a))
    print(b)  # [[1, 2], [3, 4]]

    Perlu diingatkan bahawa menggunakan modul jeruk untuk melaksanakan salinan dalam boleh menyebabkan masalah prestasi, jadi anda perlu berhati-hati apabila menggunakannya.

    5. Ringkasan

    Salinan mendalam dan cetek dalam Python ialah konsep yang sangat praktikal. Apabila melaksanakan salinan dalam dan cetek, kita boleh menggunakan modul salinan dan modul pickle dalam Python, dan memilih kaedah yang sesuai mengikut situasi tertentu. Perlu diingatkan bahawa apabila menggunakan salinan dalam, jika hierarki objek kompleks, ia boleh menyebabkan masalah prestasi, jadi salinan dalam mesti digunakan dengan berhati-hati. Semasa proses pembangunan, kita harus cuba menggunakan salinan cetek sebanyak mungkin, dan hanya mempertimbangkan untuk menggunakan salinan dalam apabila perlu.

    Selain itu, apabila menggunakan salinan dalam, jika elemen objek mengandungi objek boleh ubah, anda mesti berhati-hati semasa mengendalikan objek yang mengandungi rujukan bulat, jika tidak, anda mungkin jatuh ke dalam rekursi tak terhingga dan menyebabkan program ranap.

    Ringkasnya, salinan dalam dan cetek ialah konsep yang sangat penting dalam Python Menguasai penggunaan dan langkah berjaga-jaga salinan dalam dan cetek boleh membantu kami mengendalikan penyalinan dan pengubahsuaian objek dengan lebih baik, serta meningkatkan prestasi dan kebolehselenggaraan. program tersebut.

    Akhir sekali, mari lihat contoh praktikal yang menunjukkan cara menggunakan penyalinan yang mendalam dan cetek.

    Andaikan kita mempunyai objek kompleks yang mengandungi senarai dan kamus, dan kita perlu menyalin dan mengubah suainya. Berikut ialah kod sampel:

    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'}}

    Dalam kod sampel di atas, kami mula-mula mentakrifkan objek kompleks a yang mengandungi senarai dan kamus, dan kemudian menggunakan salinan cetek dan salinan dalam untuk menyalin dan mengubah suainya.

    Dengan memanggil fungsi copy() untuk membuat salinan cetek objek a, anda boleh mendapatkan objek baharu b. Kemudian, kami mengubah suai atribut alamat dalam nama, skor, dan maklumat objek baharu b, dan mencetak nilai objek asal a dan objek baharu b. Dapat dilihat bahawa nilai objek asal a tidak berubah, tetapi nilai objek baru b telah berubah.

    Dengan menggunakan fungsi deepcopy() untuk deep copy objek a, kita boleh mendapatkan objek baru c. Kemudian, kami mengubah suai atribut alamat dalam nama, skor, dan maklumat objek baharu c, dan mencetak nilai objek asal a dan objek baharu c. Dapat dilihat bahawa nilai objek asal a tidak berubah, tetapi nilai objek baru c telah berubah.

    Melalui kod contoh di atas, kita dapat melihat bahawa salinan dalam dan cetek sangat berguna apabila berurusan dengan objek yang kompleks, dan boleh membantu kita mengendalikan penyalinan dan pengubahsuaian objek dengan lebih baik. Dalam pembangunan sebenar, kita harus memilih kaedah penyalinan yang sesuai mengikut senario tertentu, menggunakan salinan cetek sebanyak mungkin, dan hanya menggunakan salinan dalam apabila perlu.

    Atas ialah kandungan terperinci Apakah kegunaan dan langkah berjaga-jaga penyalinan dalam dan cetek dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam