Python'da nesnelerin kopyalanması yüzeysel (shallow copy) ve derin (deep copy) olarak iki şekilde gerçekleşebilir. Yüzeysel kopya yeni bir kap oluşturur, ancak iç içe nesneler kopyalanmaz, aynı nesnelere referanslar kullanılır. Derin kopya, tüm iç içe nesnelerin yeni kopyalarını oluşturur ve kopyaların bağımsızlığını sağlar.
copy modülü copy() (shallow copy) ve deepcopy() (deep copy) yöntemlerini sağlar:
import copy original = [[1, 2], [3, 4]] shallow = copy.copy(original) deep = copy.deepcopy(original) shallow[0][0] = 99 print(original) # [[99, 2], [3, 4]] ← orijinal nesne değişti! deep[1][1] = 42 print(original) # [[99, 2], [3, 4]] - değişmedi
list2 = list1operatörü ilecopy.copy(list1)kullanımı arasındaki fark nedir?
Cevap: list2 = list1 operatörü, aynı nesneye yeni bir referans oluşturur. copy.copy(list1) yüzeysel bir kopya yaparak yeni bir liste nesnesi oluşturur, ancak aynı iç nesneleri kullanır. İç içe yapılar için yüzeysel kopya yeterli değildir - derin kopya gereklidir.
Hikaye
REST API geliştirilirken, şablondan veriler sıradan bir atama ile kopyalanıyordu (
data = template). Sonraki istek, aynı referans kullanıldığı için "şablon"u tüm sonraki kullanıcılar için yanlışlıkla değiştirdi.
Hikaye
Raporlama modülünde veriler
copy.copy()ile kopyalanıyordu, oysa yapı iç içe (sözlüklerde listeler) idi. Kopyadaki değişiklikler beklenmedik bir şekilde orijinal verilere yansıdı ve istatistiklerde hatalara neden oldu.
Hikaye
Bir bankacılık projesinde,
copy.copy()ile hatalı bir iç içe nesnenin kopyalanması (değildeepcopy()) işlem geçmişinin kaybolmasına neden oldu - yeni işlemler eski işlemleri üst üste yazdı çünkü iç elemanlar ortak kullanılıyordu.