2011-07-25 13 views

Odpowiedz

5

Nie kopiuje przy zapisie.

Nie wykonuje głębokiej kopii na niektórych wbudowanych typach niezmiennych, ale każdy zdefiniowany przez użytkownika typ "niezmienny" będzie głęboko kopiowany.

copy.py in the Python 2.7 standard library obejmuje tę wiadomość w jego dokumentacji:

Ta wersja nie kopiuje typy jak modułu, klasy, funkcje, metody, ani śladu stosu, ramki stosu, ani pliku, gniazda, okno, ani tablicy, ani żadnych podobnych typów.

copy obsługuje niezmienne obiektów tak:

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 używa bardziej skomplikowany system, który jest zbyt długi, aby skopiować do tego najbardziej, ale istota jest taka sama. Interesującym punktem jest to, że _deepcopy_tuple iteruje poprzez swoje elementy i nie tworzy nowego obiektu, dopóki nie znajdzie elementu, który został skopiowany.

for i in range(len(x)): 
    if x[i] is not y[i]: 
     y = tuple(y) 
     break 
else: 
    y = x 
+0

+1 za podanie tego linku. Wiersze 41-43 jasno określają, co jest kopiowane, a co nie. – Emiliano

+2

Wygląda na to, że jest mądrzejszy: zgodnie z moimi testami, '(1, [2,3])' zostanie skopiowane, ale '(1, (2,3))' nie będzie. Najwyraźniej patrzy na zawarte typy, jak również na pojemnik. – interjay

+0

@Happy Ha, nawet nie zauważyłem. Powinienem to uwzględnić w odpowiedzi. –

4

Nie, nie, po prostu kopiuje obiektów. Musi także kopiować niezmienne obiekty, jeśli odwołują się do mutables.

+1

Ah Nie myślałem o niezmiennych obiektach odwołujących się do zmiennych. +1 za to. Czy to oznacza, że ​​jeśli wydam deepcopy dla obiektów 2-modułowych, to nawet obiekty funcion są kopiowane (tj. Mam 2 wystąpienia tej samej funkcji w pamięci)? – Emiliano

+1

@happy_emi: funkcje nie są kopiowane. Spróbuj 'deepcopy (deepcopy) is deepcopy'. –

3

Zobaczmy:

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

Dla pierwszego elementu x i y, kopia jest wykonywana, a obiekt ma nowy identyfikator. Trzeci element, niezmienny ciąg, nie jest kopiowany.

Powiązane problemy