Re: [Python-es] Duda con operador de identidad

2010-07-19 Por tema Chema Cortes
Si alguien quiere más información, hace mucho discutimos ésto mismo:

  http://mail.python.org/pipermail/python-es/2002-August/001071.html
  http://mail.python.org/pipermail/python-es/2002-August/001080.html
  http://mail.python.org/pipermail/python-es/2002-August/001096.html

Magistral la explicación de Ernesto Revilla:

  http://mail.python.org/pipermail/python-es/2002-August/001074.html
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


[Python-es] Duda con operador de identidad

2010-07-17 Por tema Sergio Martín
Porqué pasa esto?

 a = 'UnaPalabra'
 b = 'UnaPalabra'
 a is b
True
 a = 'Dos Palabras'
 b = 'Dos Palabras'
 a is b
False

Se que para comparar cadenas hay que usar el operador de comparación (==).
Pero no entiendo porque usando el operador de identidad, en el primer ejemplo 
considere que a y b 'apunten' al mismo objeto, y en el segundo ejemplo no.
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Duda con operador de identidad

2010-07-17 Por tema Ricardo Cárdenes Medina
2010/7/17 Sergio Martín sergiomart...@gmail.com:
 Porqué pasa esto?

 a = 'UnaPalabra'
 b = 'UnaPalabra'
 a is b
 True
 a = 'Dos Palabras'
 b = 'Dos Palabras'
 a is b
 False

Python hace caché de ciertos objetos (al menos Python 2.x, sucede así
con los enteros cortos). No recuerdo si sucede lo mismo con ciertas
cadenas, pero dado que son objetos inmutables, no me extrañaría.

Saludos,
Ricardo
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Duda con operador de identidad

2010-07-17 Por tema Sergio Martín
 a = 'ñ'
 b = 'ñ'
 a is b
False

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).


El 17/07/2010, a las 17:25, Ricardo Cárdenes Medina escribió:

 Python hace caché de ciertos objetos (al menos Python 2.x, sucede así
 con los enteros cortos). No recuerdo si sucede lo mismo con ciertas
 cadenas, pero dado que son objetos inmutables, no me extrañaría.
 
 Saludos,
 Ricardo
 ___
 Python-es mailing list
 Python-es@python.org
 http://mail.python.org/mailman/listinfo/python-es
 FAQ: http://python-es-faq.wikidot.com/

___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Duda con operador de identidad

2010-07-17 Por tema Hernán Foffani

 Porqué pasa esto?
 
 a = 'UnaPalabra'
 b = 'UnaPalabra'
 a is b
 True
 a = 'Dos Palabras'
 b = 'Dos Palabras'
 a is b
 False
 
 Python hace caché de ciertos objetos (al menos Python 2.x, sucede así
 con los enteros cortos). No recuerdo si sucede lo mismo con ciertas
 cadenas, pero dado que son objetos inmutables, no me extrañaría.

Lo hace con las cadenas que pueden ser identificadores válidos.
En el segundo caso da Falso por el blanco.
 
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Duda con operador de identidad

2010-07-17 Por tema Arnau Sanchez
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
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/