2011-07-25 14 views

cevap

5

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 
+0

+1. Çizgiler 41-43, neyin kopyalandığını ve nelerin yapılmadığını açıkça belirtir. – Emiliano

+2

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

+0

@happy Ha, ben bile fark etmedi. Bunu cevaba dahil etmeliyim. –

4

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.

+1

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

+1

@happy_emi: işlevler kopyalanmaz. Deepcopy (deepcopy) 'in derinlikli olduğunu deneyin. Bu bağlantıyı sağlamak için –

3

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.