Como sabe cualquier programador de Python, debe usar ==
en lugar de is
para comparar dos cadenas para la igualdad. Sin embargo, ¿hay realmente algún caso donde (s is "")
y (s == "")
darán resultados diferentes en Python 2.6.2?¿Puede (s es "") y (s == "") dar resultados diferentes en Python 2.6.2?
Hace poco encontré el código que usa (s is "")
en la revisión del código, y aunque señalé que esto era incorrecto, quería dar un ejemplo de cómo podría fallar. Pero por más que lo intente, no puedo construir dos cadenas vacías con identidades diferentes. Parece que la implementación de Python debe tener un caso especial en la cadena vacía en muchas operaciones comunes. Por ejemplo:
>>> a = ""
>>> b = "abc"[ 2:2 ]
>>> c = ''.join([])
>>> d = re.match('()', 'abc').group(1)
>>> e = a + b + c + d
>>> a is b is c is d is e
True
Sin embargo, this question sugiere que son casos en que (s is "")
y (s == "")
puede ser diferente. ¿Alguien puede darme un ejemplo?
Sin embargo, esto prueba dos tipos diferentes de objetos de cadena, 'str' y' unicode'. La pregunta aún permanece cuando s es del mismo tipo, o si usas Python 3 en el que ya no hay un objeto explícito 'unicode'. – poke
@poke, la pregunta explícitamente se centra en Python 2.6.2 y no en Python 3. – zoli2k
Es cierto, pero es una distinción importante que hacer y esta probablemente no sea la forma más amigable de hacerlo. ¿Qué prueba realmente significaba ese código? ¿Que 'la cosa pasada adentro era equivalente a una cuerda vacía' o que 'la cosa pasada adentro era de tipo str y vacía'? Imo si fuera el último, entonces una prueba explícita de tipo sería más amigable para los futuros mantenedores y usuarios. – pycruft