No hace copia en escritura.
No hace una copia profunda en algunos tipos inmutables incorporadas, pero cualquier tipo "inmutables" definidos por el usuario será copiado de profundidad.
copy.py in the Python 2.7 standard library incluye este mensaje en su documentación:
Esta versión no copia tipos como módulo, clase, función, método, ni seguimiento de la pila, marco de pila, ni archivo, socket, ventana, ni matriz, ni ningún tipo similar.
copy
trata los objetos inmutables como esto:
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
utiliza un esquema más complicado que es demasiado largo para copiar en ésta, la más, pero la esencia es la misma. Un punto interesante es que _deepcopy_tuple
recorre sus elementos y no crea un objeto nuevo hasta que encuentra un elemento que se ha copiado.
for i in range(len(x)):
if x[i] is not y[i]:
y = tuple(y)
break
else:
y = x
+1 por proporcionar ese enlace. Las líneas 41-43 indican claramente qué se copia y qué no. – Emiliano
Parece ser más inteligente que eso: según mis pruebas, '(1, [2,3])' se copiará, pero '(1, (2,3))' no lo hará. Entonces, aparentemente, mira tanto los tipos contenidos como el contenedor. – interjay
@happy Ha, ni siquiera me di cuenta. Debería incluir eso en la respuesta. –