Python'da değişken ataması (örneğin, a = b) nesneyi kopyalamaz, yalnızca mevcut nesneye yeni bir isim (referans) oluşturur. Eğer bu değişken değiştirilebilir bir nesne ise, bir isimle yapılan değişiklikler diğerinde de görünür.
Shallow copy (yüzeysel kopyalama), örneğin copy.copy(obj) veya liste için kesim [:] ile, üst düzeyde yeni bir nesne oluşturur, ancak içindeki gömme nesneler referansla kopyalanır (yani her iki yapı "aynı alt konteynırlara bakar"). Eğer gömme nesneleri değiştirirseniz, değişiklikler her iki nesne üzerinden de görünür.
Örnek:
import copy lst1 = [[1,2], [3,4]] lst2 = copy.copy(lst1) # veya lst1[:] lst1[0][0] = 100 print(lst2) # [[100, 2], [3, 4]]
lst2 yeni bir listedir, ancak birinci elemanı aynı gömme listedir.
Soru: lst2 = lst1[:] ile lst2 = copy.copy(lst1) arasındaki fark nedir?
Cevap: Pratikte, normal (tek düzey) listeler için fark yoktur — her iki yöntem de listenin yüzeysel kopyasını yapar. Ancak, kullanıcı tanımlı konteyner sınıfları için farklı davranışlar olabilir (örneğin, __copy__ metodunu uyguladıysanız). Diğer türler (dict, set vb.) için özel kopyalama modülünü kullanmak daha güvenlidir.
import copy lst1 = [1, 2, 3] lst2 = lst1[:] lst3 = copy.copy(lst1) print(lst2 == lst3) # True
Hikaye
Bir konfigürasyon işleme projesinde, geliştirici varsayılan parametreleri params = default_params ile atayarak her birini "izole" olarak değiştirebileceğini düşündü. Sonuç olarak, her kopyada yapılan değişiklikler uygulamanın her yerinde bir değişim dalgasına yol açtı, çünkü aslında tek bir nesne ile çalışıyordu.
Hikaye
Deneyimsiz bir programcı, oyun durumlarını saklamak için liste için yüzeysel kopya kullandı (game_states = states[:]). İç içe yapı (sahnedeki figürlerin listesi) ile, bir durum içindeki değişiklikler diğerlerine "sızdı", geri alma ve hamle tekrarlarını bozarak tarihi kırdı.
Hikaye
Bir nesne yönelimli uygulamada verileri kopyalama çabası için kesim ile copy.copy() arasında seçim yapıldı. Ancak yapıda, yalnızca copy.copy() kullanıldığında dikkate alınan kendi copy metoduna sahip bir sınıfla karşılaşıldı. Kesim, nesne kopyalama mantığını göz ardı etti ve belirgin olmayan hatalar oluştu.