decir que tengo dos listas:Python referencias de datos básica, lista de misma referencia
>>> l1=[1,2,3,4]
>>> l2=[11,12,13,14]
puedo poner esas listas en una tupla, o diccionario, y parece que son todas las referencias volver a la lista original :
>>> t=(l1,l2)
>>> d={'l1':l1, 'l2':l2}
>>> id(l1)==id(d['l1'])==id(t[0])
True
>>> l1 is d['l1'] is t[0]
True
Puesto que son las referencias, puedo cambiar l1
y los datos indicados en la tupla y el cambio diccionario en consecuencia:
>>> l1.append(5)
>>> l1
[1, 2, 3, 4, 5]
>>> t
([1, 2, 3, 4, 5], [11, 12, 13, 14])
>>> d
{'l2': [11, 12, 13, 14], 'l1': [1, 2, 3, 4, 5]}
Incluyendo si añado la referencia en el diccionario d
o referencia mutable en la tupla t
:
>>> d['l1'].append(6)
>>> t[0].append(7)
>>> d
{'l2': [11, 12, 13, 14], 'l1': [1, 2, 3, 4, 5, 6, 7]}
>>> l1
[1, 2, 3, 4, 5, 6, 7]
Si ahora me puse l1
a una nueva lista, la cuenta de referencia para la lista original disminuye:
>>> sys.getrefcount(l1)
4
>>> sys.getrefcount(t[0])
4
>>> l1=['new','list']
>>> l1 is d['l1'] is t[0]
False
>>> sys.getrefcount(l1)
2
>>> sys.getrefcount(t[0])
3
Y anexar o cambiar l1
no cambia d['l1']
o t[0]
ya que ahora es una nueva referencia. La noción de referencias indirectas es covered fairly well en los documentos de Python pero no completamente.
Mis preguntas:
es un objeto mutable siempre una referencia? ¿Puede siempre suponer que modificarlo modifica el original (a menos que haga específicamente una copia con el tipo de modismo
l2=l1[:]
)?¿Puedo armar una lista de todas las mismas referencias en Python? es decir, ¿alguna función
f(l1)
que devuelve['l1', 'd', 't']
si todos esos se están refiriendo a la misma lista?Supongo que pase lo que pase, los datos seguirán siendo válidos siempre que haya alguna referencia al mismo.
es decir:
l=[1,2,3] # create an object of three integers and create a ref to it
l2=l # create a reference to the same object
l=[4,5,6] # create a new object of 3 ints; the original now referenced
# by l2 is unchanged and unmoved
Relevante para 3: http://docs.python.org/library/weakref.html –