16. Kopyalama: Shallow ve Deep

Python’da, bir nesneyi kopyalamak için “=” operatörü kullanılır. Ancak, daha önceki konularda anlattığımız gibi bu referans tipli bir atamadır. Başka bir değişle her iki değişkenin gösterdiği adresler aynıdır. Örneğin, listeye yeni elemanlar eklediğimizde her iki liste etkilenir. Bu bölüm gerçekten bir kopyaya ihtiyacımız olduğunda ne yapmamız gerektiği üzerinedir. Öncelikle geçmişe bir dönüş yapıp, basit bir kodla problemi anlatalım.

Aynı bellek bölgesini işaret ettiğini gördük. Şimdi yeni liste üzerine bir ekleme işlemi yapalım.

Görüldüğü gibi eklenen yeni verilerden sadece yeni_list değil aynı zamanda eski_list etkilenmiştir. Çünkü “=” ifadesi nesnelerin adreslerini aktarır.

16. 1. Kopyalama işlemi

Bazen orijinal değerleri kaybetmeden değişkeninizin bir kopyasına ihtiyaç duyabilirsiniz ve tabii ki yapılan bir değişiklik orijinal verinin bozulmasını istemezsiniz. Bunun için kendiniz bir kopyalama fonksiyonu yazabilirsiniz, ancak Python bu durumu düşünmüş ve size iki farklı kopyalama imkanı sunmuştur.

  • Shallow
  • Deep

Bunun için copy modülünü kullanacağız.

16. 1. 1. Shallow kopyalama

Shallow kopyalama işlemi değişkenin iç değerleri referans bazlı taşır. Ancak, değişkenin kendisi farklı bir adreste yer alır. Biraz kafalar karıştı. Örnek üzerinden gidelim.

Görüldüğü gibi eski ve yeni listelerin bellek adresleri farklıdır. Ancak, birinci elemanların bellek adresleri aynıdır. Şimdi yeni listeye bir append işlemi yapalım. Bakalım eski liste etkilenecek mi?

Yeni listeye append ile ekleme yaptığımızda eski liste bundan etkilenmez. Ancak, yeni_list[0][0] noktasını değiştirdiğimizde eski liste bundan etkilenir. Çünkü liste öğeleri kopyalama sırasında referans türünden taşınmıştır. Örneğin,

16. 1. 2. Deep kopyalama

Shallow kopyalama her ne kadar yeni bir bellek bölgesi açsa da, taşınan öğeler referans türünden taşınır. Şimdi tamamen hem değişken hem de değişken öğeleri için yeni bir bellek bölgesi açalım. Bu sayede ne append yaptığımızda ne de bir güncelleme yaptığımızda iki değişken birbirinden etkilenmesin.

Hepsinin bellek bölgesinin birbirinden farklı olduğu görüyoruz. Şimdi bir append bir de güncelleme yapalım.

Deepcopy sayesinde her iki liste tamamen birbirinden farklı oldu.