Bazen bir nesnenin tam kopyasını istersiniz, bazen de onun referanslar kullanmasını istersiniz. Eylemdeki farklılıkları görün.

Python, verileri yönetmek için çeşitli etkili yaklaşımlar sunar. İç içe geçmiş listeler, sözlükler veya özel nesneler gibi veri yapılarıyla çalışırken sığ ve derin kopya kavramlarını anlamak çok önemlidir.

Hem sığ hem de derin kopya, veri yapılarının kopyalarını oluşturmanıza olanak tanır, ancak bunlar iç içe geçmiş verilerle ilgili olarak farklı davranır.

Sığ Kopyayı Kullanma

Sığ kopyalama, orijinal nesnenin üst düzey yapısının bir kopyasını oluşturarak çalışır. Bu, orijinal nesnenin iç içe geçmiş nesneler içermesi durumunda kopyanın, orijinalle aynı iç içe geçmiş nesnelere referans vereceği anlamına gelir. Başka bir deyişle, bir nesnenin yüzeysel bir kopyasını oluşturmak, içerebileceği iç içe geçmiş nesneleri değil, onun en dış yapısını kopyalar.

Python'da yüzeysel bir kopyalama gerçekleştirmek için kopyalama modülünün kopya() işlevi veya .kopya() nesne üzerinde yöntem.

instagram viewer

Bir örnek düşünün Python'da bir liste veya sözlükle çalışma.

import copy

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Yukarıdaki kodda, ana_liste değişken tam sayıları içeren bir listeyi ve harfleri içeren bir iç listeyi (iç içe nesne) tutar. Kopyalama işlevi, bir kopyasını oluşturur. ana_liste kodun başka bir değişkende sakladığı, sığ_kopya.

Yaptığınız herhangi bir değişiklik sığ_kopya iç içe geçmiş liste aynı zamanda doğrudan ana_liste ve tam tersi. Bu değişiklikler, iç içe geçmiş veya iç listenin sığ_kopya sadece buna bir referanstır ana_listedeğişikliklerin geçerli olmasını sağlamak ana_liste fazla.

Bu arada, her ikisinde de dış öğelerde (tamsayılar) yapılan herhangi bir değişiklik sığ_kopya veya ana_liste yalnızca bu örneği etkileyecektir. Bu dış öğeler yalnızca referanslar değil, kendi başlarına bağımsız değerlerdir.

import copy

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Çıktı, her iki listenin dış öğelerinin birbirinden bağımsız olduğunu gösterir:

Sözlüklerle çalışırken de aynı fikir geçerlidir.

dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}}
dict2 = dict1.copy()

# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00

print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")

İç içe sözlüğünde yapılan değişiklikler dict1 ikisini de etkiler dict1 Ve dict2. Aynı zamanda dış öğelerde de değişiklikler yapılır. dict1 yalnızca onu etkiler.

Derin Kopyayı Kullanma

Derin kopya, orijinal kopyanın iç içe geçmiş nesnelerine referans vermek yerine, orijinal nesnenin ve onun iç içe geçmiş nesnelerinin tamamen ayrı bir kopyasını oluşturur. Derin kopyanın değiştirilmesi orijinal nesneyi etkilemez; bunun tersi de geçerlidir; bunlar gerçekten ayrı değerlerdir.

Python'da derin bir kopya oluşturmak için şunu kullanın: derin kopya() kopyalama modülünün işlevi.

Bir listeyle çalışmanın bir örneğini düşünün.

import copy

main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)

# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500

print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")

Burada kod, derin bir kopyasını gerçekleştirir. ana_listeadlı bağımsız bir kopya oluşturarak derin_kopya.

İç içe geçmiş listeyi veya dış öğeleri değiştirdiğinizde derin_kopya, değişiklikleriniz orijinal listeyi etkilemez ve bunun tersi de geçerlidir. Bu, iç içe geçmiş listenin veya dış öğelerin iki kopya arasında paylaşılmadığını gösterir.

Özel Nesnelerle Çalışmak

Şunu yaparak özel bir nesne oluşturabilirsiniz: Python sınıfını tanımlama ve sınıfın bir örneğini oluşturmak.

İşte basit bir nesneden yaratmanın bir örneği Kitap sınıf:

classBook:
def__init__(self, title, authors, price):
self.title = title
self.authors = authors
self.price = price

def__str__(self):
returnf"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"

Şimdi bunun bir örneğinin hem sığ hem de derin kopyasını yapın Kitap kullanarak sınıf kopyala modülü.

import copy

# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
["Bobby Jack", "Princewill Inyang"], 1000)

# Make a shallow copy
book2 = copy.copy(book1)

# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50

# Check the objects
print(book1)
print(book2)

Gördüğünüz gibi sığ kopya (kitap2) yeni bir nesnedir, ancak orijinal nesneyle aynı iç nesneye (yazar listesi) başvuruda bulunur (1 kitap). Dolayısıyla, orijinal nesnenin yazarlarında yapılan bir değişiklik her iki örneği de (kitap1 ve kitap2) etkilerken, dış öğede (fiyat) yalnızca orijinal nesneyi etkiler (1 kitap).

Öte yandan, derin bir kopya oluşturmak, orijinal nesnenin, içinde bulunan tüm nesnelerin kopyaları da dahil olmak üzere bağımsız bir kopyasını oluşturur.

# Create a Book object
book1 = Book("Why MakeUseOf Deep Copy?", \
["Bobby Jack", "Yuvraj Chandra"], 5000)

# Make a deep copy
book2 = copy.deepcopy(book1)

# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60

# Check the objects
print(book1)
print(book2)

Bu durumda, derin kopya (kitap2) tamamen bağımsız bir nesnedir ve orijinal nesneyi (1 kitap) etkilemez.

Sığ Kopyalama ve Derin Kopyalamanın Kullanım Alanları

Verileri işlemek için uygun yaklaşımı seçebilmeniz amacıyla derin ve yüzeysel kopyayı anlamak hayati önem taşır. Her yöntemin uygulanabileceği bazı senaryolar şunlardır:

  • Karmaşık bir nesneyi, iç içe geçmiş nesnelerin yeni örneklerini oluşturmadan çoğaltmak istiyorsanız sığ bir kopya kullanın. Bu yaklaşım, iç içe geçmiş nesneleri çoğaltmadığı için derin kopyalamaya göre bellek açısından daha verimli ve daha hızlıdır.
  • Orijinal ve kopyalanan nesneler arasında bazı temel verileri paylaşmaya devam ederken bir nesnenin durumunun anlık görüntüsünü oluşturmak için sığ bir kopya kullanın.
  • Orijinali etkilemeden bir nesnenin kopyasını değiştirmek istiyorsanız derin kopya kullanın. Bu, iç içe geçmiş nesnelerin bağımsız kopyalarını oluşturarak kopyada yapılan değişikliklerin orijinale uygulanmamasını sağlar.
  • Derin kopyalama, özellikle yinelemeli veya karmaşık nesne hiyerarşileriyle uğraşırken, iç içe geçmiş veri yapılarının bağımsız kopyalarına ihtiyaç duyduğunuzda kritik öneme sahiptir.

Performans ve Hususlar

Sığ kopya, iç içe geçmiş nesnelerin yeni örneklerini oluşturmadığından, genellikle daha hızlı çalışır ve derin kopyaya göre daha az bellek kullanır. Ancak orijinal ve sığ kopya, paylaşılan dahili öğelerin değiştirilmesi nedeniyle istenmeyen yan etkilere neden olabilir.

Özellikle büyük ve derinlemesine iç içe geçmiş veri yapıları için derin kopyalama, yinelenen bir prosedür, daha yavaş olabilir ve daha fazla bellek kullanabilir. Ancak orijinal ile derin kopya arasında tam bağımsızlık sağlayarak karmaşık veri manipülasyonunu daha güvenli hale getirir.

Verileriniz için En İyi Kopyalama Seçeneği

Birçok programlama dili sığ ve derin kopya kavramını kullanır. Bunu anlamak, verileri öngörülemeyen sonuçlar olmadan değiştirmenize olanak tanır.

Sığ ve derin kopyalama tekniklerini kullanarak veri yapılarınızı güvenli bir şekilde kopyalamak için en iyi yaklaşımı seçebilirsiniz. Verileriniz üzerindeki etkileri anlayarak kodunuzdan daha güvenilir ve öngörülebilir sonuçlar elde edeceksiniz.