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/
