Asignaciones e identidades

Chema Cortés chemacortes en wanadoo.es
Lun Ago 19 12:24:41 CEST 2002


Hola a todos:

Ya de vuelta de vacaciones, he hecho algunos deberes.

Una de las cosas que me ha dado por estudiar es la relación entre asignaciones 
e identidades. He creado el siguiente test:

>>> a=3
>>> b=3
>>> a is b
1

Aquí vemos que, aunque 'a' y 'b' se crean en diferentes sentencias, ambos son 
el mismo objeto!!!. He repetido el test para diversos tipos de datos y he 
obtenido los siguientes resultados:

3    true
3L   false
3.0  false
3j   false
""   true
()   true
[]   false
{}   false

No he encontrado una posible explicación que explique esta diferenciación que 
se hace entre tipos de datos. ¿Alguien tiene una explicación?


Estudiando un poco más el tema de las identidades, centrado ya en las 
asignaciones de listas tenemos que, si 'L' es una lista:

>>> s=L
>>> s is L
1
>>> s=L[:]
>>> s is L
0
>>> s==L
1

Vemos que la asignación opera de dos formas distintas:

1) en la primera asignación se da a 's' la misma referencia que tiene 'L'. Por 
así decirlo, es similar una asignación de "punteros". En C++ sería:

ListType& s = L;


2) en la segunda asignación, la expresión 'L[:]' genera una nueva lista cuya 
referencia se asigna a 's'. En este caso, hay creación previa del nuevo 
objeto, cuya referencia se asigna a 's'.

ListType& s = new ListType(L);


El uso de operador de rebanado L[:] siempre es el que se ve como "truco" para 
realizar una "copia" de una lista. Todo consiste en forzar que la asignación 
se haga como en el segundo caso, para lo que se puede usar cualquier 
expresión que devuelva una lista igual a la original. 'L[:]' es el caso más 
visto, pero se podría utilizar otros operadores como el de replicación 'L*1' 
e incluso el de añadir 'L+[]'. ¿Alguna razón que haga más aconsejable el uso 
de L[:]? (Personalmente, me gusta más L*1 que L[:]).


Espero no haber sido demasiado "espeso" con el tema, pero era algo que tenía 
aún por digerir.

Saludos,
Chema Cortés


Más información sobre la lista de distribución Python-es