Python'da bir listeyi klonlamak veya kopyalamak için seçenekler nelerdir?
new_list = my_listkullanıldığında,
new_listüzerinde yapılan herhangi bir değişiklik her seferinde
my_list`i değiştirir.
Bunun nedeni nedir?
new_list = my_listile aslında iki listeniz yoktur. Atama sadece listenin referansını kopyalar, gerçek listeyi değil, bu nedenle hem
new_listhem de
my_list` atamadan sonra aynı listeye başvurur.
Listeyi gerçekten kopyalamak için çeşitli olasılıklara sahipsiniz:
Yerleşik list.copy()
yöntemini kullanabilirsiniz (Python 3.3'ten beri mevcuttur):
new_list = old_list.copy()
Dilimleyebilirsin:
new_list = old_list[:]
Alex Martelli'nin bu konudaki görüşü (en azından [2007'de][2]), bunun garip bir sözdizimi olduğu ve asla kullanılmasının mantıklı olmadığıdır.) (Ona göre, bir sonraki daha okunabilirdir).
Yerleşik list()
işlevini kullanabilirsiniz:
yeni_liste = liste(eski_liste)
Genel copy.copy()
kullanabilirsiniz:
içe aktarma kopyası
new_list = copy.copy(old_list)
Bu list()
ten biraz daha yavaştır çünkü önce old_list
in veri türünü bulması gerekir.
Liste nesneler içeriyorsa ve bunları da kopyalamak istiyorsanız, genel copy.deepcopy()
kullanın:
içe aktarma kopyası
new_list = copy.deepcopy(old_list)
Açıkçası en yavaş ve en çok bellek gerektiren yöntemdir, ancak bazen kaçınılmazdır.
Örnek:
import copy
class Foo(object):
def __init__(self, val):
self.val = val
def __repr__(self):
return str(self.val)
foo = Foo(1)
a = ['foo', foo]
b = a.copy()
c = a[:]
d = list(a)
e = copy.copy(a)
f = copy.deepcopy(a)
# edit orignal list and instance
a.append('baz')
foo.val = 5
print('original: %r\n list.copy(): %r\n slice: %r\n list(): %r\n copy: %r\n deepcopy: %r'
% (a, b, c, d, e, f))
Sonuç:
original: ['foo', 5, 'baz']
list.copy(): ['foo', 5]
slice: ['foo', 5]
list(): ['foo', 5]
copy: ['foo', 5]
deepcopy: ['foo', 1]