Alınacak GIST şudur: "Normal atama" kullanarak sığ listelerle (alt listeler yok, yalnızca tek öğeler) ilgilenmek, sığ bir liste oluşturduğunuzda ve "normal atama" kullanarak bu listenin bir kopyasını oluşturduğunuzda "yan etki" yi artırır . Bu "yan etki", oluşturulan orijinal listenin aynı öğelerini otomatik olarak değiştireceğinden, oluşturulan kopya listesinin herhangi bir öğesini değiştirdiğiniz zamandır. O zaman olduğu copy
kopya elemanlarını değiştirirken orijinal liste elemanlarını değişmeyecek gibi kullanışlı oluyor.
Öte yandan, copy
içinde listeler (alt_ listeleri) bulunan bir listeniz olduğunda "yan etki" de olur vedeepcopy
çözen olur. Örneğin, içinde iç içe listeler bulunan büyük bir liste oluşturursanız (alt listeler) ve bu büyük listenin (orijinal liste) bir kopyasını oluşturursanız. Büyük listenin alt listelerini otomatik olarak değiştiren kopya listesinin alt listelerini değiştirdiğinizde "yan etki" ortaya çıkar. Bazen (bazı projelerde) büyük listeyi (orijinal listeniz) değiştirmeden olduğu gibi tutmak istersiniz ve tek yapmanız gereken öğelerinin bir kopyasını (alt listeler) yapmaktır. Bunun için çözümünüz, deepcopy
bu "yan etki" ile ilgilenecek ve orijinal içeriği değiştirmeden bir kopyasını yapacak olan kullanmaktır .
Farklı davranışlar copy
vedeep copy
işlemleri yalnızca bileşik nesnelerle ilgilidir (yani: listeler gibi başka nesneler içeren nesneler).
Bu basit kod örneğinde gösterilen farklılıklar şunlardır:
İlk
copy
orijinal bir liste ve bu listenin bir kopyasını oluşturarak (sığ) davranışlarını kontrol edelim :
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Şimdi, bazı print
testler yapalım ve orijinal listenin kopya listesine kıyasla nasıl davrandığını görelim:
original_list ve copy_list'in farklı adresleri var
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
original_list ve copy_list öğelerinin öğeleri aynı adreslere sahip
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
original_list ve copy_list öğelerinin alt_elimleri aynı adreslere sahip
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
original_list öğelerinin değiştirilmesi, copy_list öğelerini DEĞİŞTİRMEZ
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
copy_list öğelerini değiştirmek original_list öğelerini DEĞİŞTİRMEZ
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
original_list alt_elementlerini değiştirmek otomatik olarak copy_list alt_elementlerini değiştirir
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 7]
copy_list alt_elementlerini değiştirmek orijinal_list alt_elementlerini otomatik olarak değiştir
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 7]
İkinci
hadi nasıl deepcopy
davrandığımızı, copy
orijinal bir liste ve bu listenin bir kopyasını oluşturarak) kontrol edelim :
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Şimdi, bazı print
testler yapalım ve orijinal listenin kopya listesine kıyasla nasıl davrandığını görelim:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_list ve copy_list'in farklı adresleri var
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
original_list ve copy_list öğelerinin öğeleri aynı adreslere sahip
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
original_list ve copy_list alt öğelerinin farklı adresleri var
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
original_list öğelerinin değiştirilmesi, copy_list öğelerini DEĞİŞTİRMEZ
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
copy_list öğelerini değiştirmek original_list öğelerini DEĞİŞTİRMEZ
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
original_list alt_elementlerini değiştirmek copy_list alt_elementlerini DEĞİŞTİRMEZ
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
copy_list alt_elementlerini değiştirmek orijinal_list alt_elementlerini DEĞİŞTİRMEZ
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'd'], 7]