[Python-es] Asignaciones e identidades
Hernan Martinez Foffani
hernan en orgmf.com.ar
Lun Ago 19 14:53:30 CEST 2002
> 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!!!.
esto en python se llama "interning". no solo depende del
tipo del objeto sino de su valor. por ejemplo, si en lugar
de 3 probamos con otros numeritos...
>>> a=99
>>> b=99
>>> a is b
1
>>> a=100
>>> b=100
>>> a is b
0
>>>
es una optimizacion de python para evitar pagar el coste
de creación de objetos.
> 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?
solo se puede hacer "interning" sobre los tipos de datos
inmutables. y dentro de ellos algunos se hace automaticamente
y sobre otros no. por ejemplo, los strings se hacen interning
solo si se "parecen" a un nombre de valido en python.
>>> a = "variable"
>>> b = "variable"
>>> a is b
1
>>> a = "no es variable"
>>> b = "no es variable"
>>> a is b
0
>>>
el programador puede forzar el interning de strings mediante el
builting intern()
> 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[:]).
¿será por velocidad? L[:] es el "idiom" mas usado.
Saludos,
-Hernan
Más información sobre la lista de distribución Python-es