Ayrıca, deepcopy nonmutable nesne üzerinde de yapılır olmadığını bilmek istiyorum
cevap
Bu kopya üzerinde yazma yapmaz.
Bazı yerleşik yerleşik olmayan türlerde derin bir kopya yapmaz, ancak kullanıcı tanımlı "değişmez" türler derin kopyalanır.
copy.py in the Python 2.7 standard library belgelerinde bu mesajı aşağıdakileri içerir:
modülü, sınıf, fonksiyon, yöntem, ne de yığın izleme, yığın çerçevesi, ne de dosya, soket, pencere, ne de dizi gibi türleri kopyalamadığını Bu sürüm, ne de benzer türler.
copy
böyle değişmez nesneler işler:
def _copy_immutable(x):
return x
for t in (type(None), int, long, float, bool, str, tuple,
frozenset, type, xrange, types.ClassType,
types.BuiltinFunctionType, type(Ellipsis),
types.FunctionType, weakref.ref):
d[t] = _copy_immutable
for name in ("ComplexType", "UnicodeType", "CodeType"):
t = getattr(types, name, None)
if t is not None:
d[t] = _copy_immutable
deepcopy
bu en içine kopyalamak için çok uzun daha karmaşık bir düzeni kullanır, ancak özü aynıdır. Bir başka ilginç nokta kopyalandığı bir öğe bulana kadar onun elemanları aracılığıyla _deepcopy_tuple
dolaşır ve yeni bir nesne oluşturmak kalmamasıdır.
for i in range(len(x)):
if x[i] is not y[i]:
y = tuple(y)
break
else:
y = x
Hayır, değil mi, sadece kopya nesneleri yapar (yani ancak bana garip görünüyor). Ayrıca, mutasyonlara referans veriyorsa, değişmez nesneler de kopyalamalıdır.
Ah Değişkenleri referans alan değişmez nesneler hakkında düşünmüyordum. Bunun için +1. Ayrıca, ben 2 modül için bir deepcopy sorunu bile funcion nesneler kopyalanır nesneleri anlamına gelmez (ben bellekte aynı función 2 örneğini yani)? – Emiliano
@happy_emi: işlevler kopyalanmaz. Deepcopy (deepcopy) 'in derinlikli olduğunu deneyin. Bu bağlantıyı sağlamak için –
Bakalım:
>>> import copy
>>> x = [[1],[2],"abc"]
>>> y = copy.deepcopy(x)
>>> id(x[0])
4299612960
>>> id(y[0])
4299541608
>>> id(x[2])
4297774504
>>> id(y[2])
4297774504
x
ve y
ilk öğesi için, kopya gerçekleştirilen ve nesne yeni kimliği vardır. Üçüncü öğe, değişmez bir dize, kopyalanmaz.
+1. Çizgiler 41-43, neyin kopyalandığını ve nelerin yapılmadığını açıkça belirtir. – Emiliano
Aslında bundan daha akıllı görünüyor: Testlerime göre, '(1, [2,3])' kopyalanacak, ama '(1, (2,3))' olmayacak. Görünüşe göre, kapların yanı sıra içerilen türlere bakar. – interjay
@happy Ha, ben bile fark etmedi. Bunu cevaba dahil etmeliyim. –