Python gelişmiş seri 02 nesnelerin derin kopyası (derin kopya ve gölge kopya)

Python gelişmiş serisi 02 derin nesnelerin kopyası ve gölge kopyası

Copy () ve deepcopy () arasındaki ayrım, python'un verileri saklama şeklini içermelidir.

Her şeyden önce, doğrudan şu sonuca varıyoruz: - her zamanki kopyalama anlayışımız derin kopyalamadır, yani kopyalanan nesne bağımsız yeni bir birey olarak tamamen kopyalanacaktır. Bu nedenle, orijinal kopyalanan nesnenin değiştirilmesi, kopyalanan yeni nesneyi etkilemeyecektir. --- Ve sığ kopya tek başına var olacak bağımsız bir nesne üretmez, sadece orijinal veri bloğuna yeni bir etiket koyar, böylece etiketlerden biri değiştiğinde, veri bloğu değişir ve diğer etiket de Buna göre değişecek. Bu bizim her zamanki nüshamızdan farklı. Basit nesneler için, yüzeysel kopya ve derin kopya, karmaşık nesnelerle aynıdır.Örneğin, liste listedeyse, sığ kopyadaki alt listeler orijinal nesneden gerçekten "bağımsız" değildir. Başka bir deyişle, orijinal nesnenin alt listesindeki bir öğeyi değiştirirseniz, kopyanız da onunla birlikte değişecektir. Bu bizim sezgisel "kopya" anlayışımızdan farklıdır.

Metni okuyamamanız önemli değil. Koda bakalım:

Cop1'in, yani sığ kopyanın orijine göre değiştiğini görebilirsiniz. Ve cop2, yani derin kopya değişmedi.

Görünüşe göre derin kopya bizim sezgisel "kopya" tanımımızla daha uyumludur: bir kez kopyalandığında bağımsız olmalıdır. İstediğimiz şey gerçek bir "kopya" ise, o zaman doğrudan deep_copy kullanın.

Öyleyse neden sığ kopya gibi "sahte" bir kopya var? İlginç yer burası.

Python'un veri depolama yöntemi

Python'un değişkenleri saklama şekli diğer OOP dillerinden farklıdır. Bu, değişken için belirli bir değere referans oluşturmakla ilgili olduğundan, bir değişkene bir değer atamakla ilgili değildir.

Python'da a = bir şey olduğunda, bir şeyin üzerine a etiketi koymak olarak anlaşılmalıdır. Tekrar a'ya bir değer atarken, orijinal şeyden a etiketini alıp başka nesnelere yapıştırarak yeni bir referans oluşturmak gibidir. Bu, Python'da karşılaşılabilecek bazı garip durumları açıklar:

Yukarıdaki iki kod parçasında, a'nın değeri değişmiştir. Aradaki fark, ilk kod parçasında, a'nın yeni değerinin doğrudan atanmasıdır (den); ikinci parçada ise listedeki her bir öğe ayrı ayrı değiştirilir.

B üzerindeki etki farklıdır, biri b'nin değerini değiştirmez, diğeri değişir. Bu tuhaf farkı açıklamak için yukarıdaki neden nasıl kullanılır?

Bir nesne olarak ilk defa. a = bu öğeye bir etiket eklemeye eşdeğerdir. Ve b = a, bu öğeyi bir b etiketiyle etiketlemektir.

İlk durum:

a =, a etiketini yırtmaya ve ona yapıştırmaya eşdeğerdir.

Bu süreçte öğe kaybolmadı. b, bu referans değiştirilmediğinden baştan sona nakledildi. B'nin değeri doğal olarak değişmez.

İkinci durum:

a, a, a = 4, 5, 6 doğrudan maddenin kendisini değiştirir. İç kısmının her parçası yeniden tasarlandı. Dahili değişiklik tamamlandıktan sonra kendisi olur.

Bu süreçte, ne a ne de b hareket etti, hala nesneye bağlıydılar. Doğal olarak a b'nin değeri olur.

Bunu anladıktan sonra soracağım. Karmaşık bir nesnenin sığ bir kopyası için, kopyalama sırasında ne oldu?

Başka bir kod parçasına bakın:

Docker'ı öğrenenler aynalama kavramına aşina olmalı, aynalama kavramını kopyaya uygulayabiliriz.

Kavram haritası aşağıdaki gibidir:

Copy, karmaşık bir nesnenin alt nesnelerini tam olarak kopyalamaz .. Karmaşık bir nesnenin alt nesnesi nedir? Örneğin, dizilerdeki yuvalanmış diziler, sözlüklerdeki yuvalanmış diziler vb. Karmaşık nesnelerin tüm alt nesneleridir. Alt nesne için, python onu genel bir ayna olarak depolar ve tüm kopyaları bir referans olarak kabul edilir, bu nedenle referanslardan biri aynayı değiştirdiğinde, diğer referans aynayı kullandığında ayna değiştirilir. .

Öyleyse buradaki kökene bakın, bu liste. Yüzeysel kopya tanımına göre, cop1 aynı listeyi işaret etmektedir. Yani, buradaki listeyi değiştirirsek, origin ve cop1'in aynı anda değişmesine neden olur. Bu nedenle yukarıdaki origin = "hey!" Öğesinden sonra cop1 de olur.

Deepcopy kavram şeması aşağıdaki gibidir:

Deepcopy'de, karmaşık bir nesnenin her katmanı tek bir kişiye kopyalanır.

Şu anda, origin ve cop2'nin değerleri eşit olmasına rağmen, artık aynı liste değildir. Bu, bizim olağan anlamımızla kopyalamaktır.

Samimiyetle dolu, e-spor seçenekleri, kutudan çıkar çıkmaz HyperX Aloi yeşil eksenli mekanik klavye
önceki
Retro ve havalı, nostaljik ve klasik, Baweitang klasik Bluetooth hoparlör deneyimi
Sonraki
Python gelişmiş hata ayıklama becerileri (iki) IPython hata ayıklama becerileri (öğrenme yolları ve PDF dahil)
Küçük boyutlu ve mükemmel işçilik, bu Baweitang klasik Bluetooth hoparlörü çok bireysel
İlk yarı-Borisov 1-0 Arsenal, Dragon skorları
599.000'den başlayan 2019 BMW 6 Serisi GT satışa çıktı, tüm seriler fiyatları düşürdü ve 3.0T gücü iptal etti
Tüm yönleri dinleyin, Logitech G233 oyun kulaklığı deneyimi
Çocukluk anılarını geri getirin! Baweitang Klasik Bluetooth Hoparlör Deneyimi
Tarayabilir misin? Hayır, QR koduyla oynamak farklı olacak
Python coroutine serisi (6) asyncio + tkinter geliştirme
California Fire Bull vahşileşiyor! Red Fire Bull CR1280 PRISM Full Tower RGB Oyun Kasası Derin Araştırma
Python coroutine serisi (6) -EventLoop ve Future ayrıntılı açıklama ve eşzamanlılık gerçekleştirme
Ekspres teslimat gizlilik sayfasının gözlemlenmesi: kurye el yazısıyla yazılan bilgileri doldurur, kullanıcılar bunu zahmetli bulur
Tüm insanlar tarafından paylaşılan on bin dönümlük "göl yüzeyi": Tmall Yangcheng Gölü tüylü yengeç kartı kuponları geçen yıl aynı dönemde birkaç kez arttı
To Top