Yüzeysel kopya (shallow copy) yeni bir üst seviye nesne oluşturur, ancak iç içe geçmiş nesneler (liste elemanları, iç içe geçmiş sözlükler vb.) orijinal ile bellek paylaşır. Derin kopya (deep copy) tüm nesne seviyelerini özyinelemeli olarak kopyalar.
copy modülü aracılığıyla kullanılabilir:
import copy original = [[1, 2], [3, 4]] shallow = copy.copy(original) deep = copy.deepcopy(original) shallow[0][0] = 99 # Hem original hem de shallow'ı değiştirir print(original) # [[99, 2], [3, 4]] # Şimdi deep ile original = [[1, 2], [3, 4]] deep = copy.deepcopy(original) deep[0][0] = 99 print(original) # [[1, 2], [3, 4]]
copy.copy(obj): sadece "sarmalayıcıyı" kopyalarcopy.deepcopy(obj): tamamen özyinelemeli kopyalamaDeğiştirilebilir nesneleri içeren bir demeti kopyalarken ne olur?
tuple değiştirilemez, ancak onun elemanları değiştirilebilir olabilir (örneğin, bir liste). Yüzeysel kopya ve derin kopya arasındaki farklar:
import copy t = ([1, 2], [3, 4]) shallow = copy.copy(t) deep = copy.deepcopy(t) shallow[0][0] = 99 print(t) # ([99, 2], [3, 4]) # Derin kopyada: t = ([1, 2], [3, 4]) deep = copy.deepcopy(t) deep[0][0] = 88 print(t) # ([1, 2], [3, 4])
Hikaye
Belge işleme uygulamasında veriler, bir sözlüğün içindeki bir listede tutuluyordu. Nesneleri copy.copy ile kopyaladıklarında, iç içe geçmiş elemanlar yanlış bir şekilde yeni nesnenin modifikasyonu sırasında değişiyordu. Sonuç olarak, sistemin diğer bölümlerindeki orijinal veriler değişti! Veri bozulması yaşandı. Sadece deepcopy ile değiştirerek çözüldü.
Hikaye
Makine öğrenimi projesinde, model hiperparametrelerini kaydederken, yapılandırma listesini standart atama ve yüzeysel kopya ile kopyaladık, ardından farklı deneyler birbirinin parametrelerini karşılıklı olarak değiştirdi. Hatanın kaynağını iç içe listelerin derin kopyalama davranışını teşhis ettikten sonra bulduk.
Hikaye
Finans yazılımında, açık bir dosya (handle) içeren bir nesneye yanlışlıkla derin kopya uygulandı, bu da TypeError: cannot pickle '_io.TextIOWrapper' object hatasına yol açtı - çünkü copy.deepcopy altında pickle kullanıyor. Bu, bu tür alanların açıkça işlenmesi veya yüzeysel kopya çağrısı yoluyla düzeltildi.