[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