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