Memahami Shallow dan Deep Copy dalam Python

Memahami Shallow dan Deep Copy dalam Python
Pembaca seperti anda membantu menyokong MUO. Apabila anda membuat pembelian menggunakan pautan di tapak kami, kami mungkin mendapat komisen ahli gabungan. Baca Lagi.

Python menawarkan beberapa pendekatan yang cekap untuk mengurus data. Memahami konsep salinan cetek dan mendalam adalah penting apabila bekerja dengan struktur data seperti senarai bersarang, kamus atau objek tersuai.





Video MUO pada hari itu SCROLL UNTUK MENERUSKAN KANDUNGAN

Kedua-dua salinan cetek dan dalam membolehkan anda membuat replika struktur data, tetapi ia bertindak secara berbeza berkenaan data bersarang.





Menggunakan Shallow Copy

Salinan cetek berfungsi dengan mencipta salinan struktur peringkat atas objek asal. Ini bermakna, jika objek asal mengandungi objek bersarang, salinan akan merujuk objek bersarang yang sama seperti yang dilakukan oleh asal. Dalam erti kata lain, membuat salinan cetek objek menduplikasi struktur terluarnya, bukan sebarang objek bersarang yang mungkin terkandung di dalamnya.





Untuk melakukan salinan cetek dalam Python, anda boleh menggunakan modul salinan salinan() fungsi atau .salinan() kaedah pada objek.

Pertimbangkan contoh bekerja dengan senarai atau kamus dalam Python .



import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Dalam kod di atas, the senarai_utama pembolehubah memegang senarai yang mengandungi integer dan senarai dalam (objek bersarang) yang mengandungi huruf. Fungsi salin mencipta salinan senarai_utama yang disimpan oleh kod dalam pembolehubah lain, shallow_copy .

perisian pemetaan minda percuma terbaik 2019

Sebarang perubahan yang anda buat pada shallow_copy senarai bersarang juga akan mempengaruhi secara langsung senarai_utama dan begitu juga sebaliknya. Perubahan ini menunjukkan bahawa senarai bersarang atau dalaman bagi shallow_copy hanyalah rujukan kepada yang senarai_utama , menjadikan perubahan terpakai dalam senarai_utama juga.





  perubahan kepada senarai bersarang salinan cetek

Sementara itu, sebarang perubahan yang dibuat pada item luar (integer) dalam sama ada shallow_copy atau senarai_utama hanya akan menjejaskan kejadian itu. Item luar ini adalah nilai bebas dalam hak mereka sendiri, bukan hanya rujukan semata-mata.

import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Output menunjukkan bahawa kedua-dua item luar senarai adalah bebas antara satu sama lain:





  perubahan kepada item luar salinan cetek

Idea yang sama berlaku apabila bekerja dengan kamus.

dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}} 
dict2 = dict1.copy()

# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00

print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")

Perubahan yang dibuat pada kamus bersarang bagi dict1 mempengaruhi kedua-duanya dict1 dan dict2 . Pada masa yang sama, perubahan kepada item luar dict1 mempengaruhinya sahaja.

  menggunakan salinan cetek dengan kamus bersarang

Menggunakan Deep Copy

Daripada merujuk objek bersarang salinan asal, salinan dalam membuat salinan berasingan sepenuhnya objek asal dan objek bersarangnya. Mengubah suai salinan dalam tidak akan menjejaskan objek asal dan sebaliknya; mereka benar-benar nilai yang berasingan.

cara menambah kelantangan pada iphone

Untuk membuat salinan mendalam dalam Python, gunakan deepcopy() fungsi modul salinan.

Pertimbangkan contoh bekerja dengan senarai.

import copy 

main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)

# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500

print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")

Di sini, kod melakukan salinan yang mendalam senarai_utama , mencipta salinan bebas bernama deep_copy .

Apabila anda mengubah suai senarai bersarang atau item luar dalam deep_copy , perubahan anda tidak menjejaskan senarai asal, dan begitu juga sebaliknya. Ini menunjukkan bahawa senarai bersarang atau elemen luar tidak dikongsi antara dua salinan.

  menggunakan salinan dalam dengan senarai bersarang

Bekerja Dengan Objek Tersuai

Anda boleh membuat objek tersuai dengan mentakrifkan kelas Python dan mencipta contoh kelas.

Berikut ialah contoh mencipta objek mudah daripada a Buku kelas:

classBook: 
    def__init__(self, title, authors, price):
        self.title = title
        self.authors = authors
        self.price = price

    def__str__(self):
        returnf"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"

Sekarang, buat kedua-dua salinan cetek dan salinan dalam contoh ini Buku kelas menggunakan salinan modul.

apa yang perlu dilakukan sekiranya telefon anda tersekat di skrin epal
import copy 

# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
             ["Bobby Jack", "Princewill Inyang"], 1000)

# Make a shallow copy
book2 = copy.copy(book1)

# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50

# Check the objects
print(book1)
print(book2)

Seperti yang anda lihat, salinan cetek ( buku2 ) ialah objek baharu, tetapi ia merujuk objek dalaman yang sama (senarai pengarang) sebagai objek asal ( buku1 ). Oleh itu, perubahan kepada pengarang objek asal mempengaruhi kedua-dua kejadian (book1 dan book2), manakala perubahan kepada item luar ( harga ) hanya mempengaruhi objek asal ( buku1 ).

  menggunakan salinan cetek dengan objek tersuai

Sebaliknya, membuat salinan mendalam mencipta salinan bebas objek asal, termasuk salinan semua objek yang terkandung di dalamnya.

# Create a Book object 
book1 = Book("Why MakeUseOf Deep Copy?", \
             ["Bobby Jack", "Yuvraj Chandra"], 5000)

# Make a deep copy
book2 = copy.deepcopy(book1)

# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60

# Check the objects
print(book1)
print(book2)

Dalam kes ini, salinan dalam ( buku2 ) ialah objek bebas sepenuhnya, dan mengubah suai objek asal ( buku1 ) tidak menjejaskannya.

  menggunakan salinan dalam dengan objek tersuai

Kegunaan untuk Shallow Copy dan Deep Copy

Adalah penting untuk memahami salinan yang mendalam dan cetek supaya anda boleh memilih pendekatan yang sesuai untuk memanipulasi data. Berikut ialah beberapa senario di mana setiap kaedah boleh digunakan:

  • Gunakan salinan cetek jika anda ingin meniru objek kompleks tanpa menghasilkan contoh baharu objek bersarangnya. Pendekatan ini lebih cekap memori dan lebih pantas daripada salinan dalam kerana ia tidak menduplikasi objek bersarang.
  • Gunakan salinan cetek untuk membuat syot kilat keadaan objek sambil masih berkongsi beberapa data asas antara objek asal dan objek yang disalin.
  • Gunakan salinan dalam jika anda ingin mengubah suai replika objek tanpa menjejaskan yang asal. Ini menjana salinan bebas objek bersarang, memastikan bahawa sebarang perubahan pada salinan tidak digunakan pada yang asal.
  • Salinan dalam adalah kritikal apabila anda memerlukan salinan bebas struktur data bersarang, terutamanya apabila berurusan dengan hierarki objek rekursif atau rumit.

Prestasi dan Pertimbangan

Memandangkan salinan cetek tidak menjana contoh baharu objek bersarang, ia biasanya berjalan lebih pantas dan menggunakan kurang memori berbanding salinan dalam. Walau bagaimanapun, salinan asal dan salinan cetek mungkin mempunyai kesan sampingan yang tidak diingini daripada menukar item dalaman yang dikongsi.

Terutamanya untuk struktur data yang besar dan bersarang dalam, salinan dalam, prosedur rekursif , boleh menjadi lebih perlahan dan menggunakan lebih banyak memori. Walau bagaimanapun, ia memastikan kebebasan sepenuhnya antara yang asal dan pendua mendalam, menjadikan manipulasi data yang rumit lebih selamat.

Pilihan Salin Terbaik untuk Data Anda

Banyak bahasa pengaturcaraan menggunakan konsep salinan cetek dan mendalam. Memahaminya membolehkan anda memanipulasi data tanpa akibat yang tidak dijangka.

Dengan menggunakan teknik penyalinan cetek dan mendalam, anda boleh memilih pendekatan terbaik untuk menduplikasi struktur data anda dengan selamat. Dengan memahami kesan pada data anda, anda akan mendapat hasil yang lebih boleh dipercayai dan boleh diramal daripada kod anda.