On Sat, 17 Jul 2010 16:55:39 +0200 Sergio Martín wrote:

> Porqué pasa esto?
> 
> >>> a = 'UnaPalabra'
> >>> b = 'UnaPalabra'
> >>> a is b
> True
> >>> a = 'Dos Palabras'
> >>> b = 'Dos Palabras'
> >>> a is b
> False

Un pequeño exordio: como sabemos las cadenas en Python son inmutables,
así que por eficiencia las implementaciones suelen mantener una caché
para reusarlas (lo que se conoce como "string interning"). Esto
explica que dos cadenas "diferentes" en realidad apunten (o puedan
apuntar) al mismo objeto.

Pero tu duda es razonable, ¿por qué a veces sí y a veces no?

> Sigo haciendo pruebas, y cuando meto algún carácter que no sea una
> letra ASCII o un número me da False (espacios, eñes o tildes).

La razón es que el "interning" de una cadena no se hace de forma
incondicional, cada implementación tiene libertad para definir cuándo
hacerlo. En este caso parece que si CPython ve que la cadena no es un
nombre de variable válido (por los espacios, acentos, etc) no lo
"interna", interpretando que en tal caso no vale la pena (aunque en
mis pruebas sí lo hace al correr el mismo código en un script normal).

Esta es la razón por la que no se puede hacer cadena1 is cadena2, el
resultado depende por completo de la política de "interning" de la
implementación (que a su vez suelen tener reglas heurísticas complejas).
_______________________________________________
Python-es mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a