Pregunta

Estoy intentando comparar dos cadenas con es . Una función devuelve una cadena y la otra se declara en la comparación. es prueba la identidad del objeto, pero de acuerdo con esta página , También funciona con dos cadenas idénticas debido a la optimización de memoria de Python. Pero, lo siguiente no funciona:

def uSplit(ustring):
        #return user minus host
        return ustring.split('!',1)[0]

user = uSplit('theuser!host')
print type(user)
print user
if user is 'theuser':
    print 'ok'
else:
    print 'failed'

user = 'theuser'

if user is 'theuser':
    print 'ok'

La salida:

type 'str'
theuser
failed
ok

Supongo que la razón de esto es que una cadena devuelta por una función es un " tipo " diferente de cadena que un literal de cadena. ¿Hay alguna forma de obtener una función para devolver una cadena literal? Sé que podría usar == , pero tengo curiosidad.

¿Fue útil?

Solución

El sitio que cita dice esto:

  

Si dos literales de cadena son iguales, se han colocado en la misma ubicación de memoria.

Pero

uSplit('theuser!host')

no es un literal de cadena: es el resultado de una operación en el literal 'theuser! host' .

De todos modos, generalmente no debe verificar la igualdad de cadena usando es , porque esta optimización de memoria en cualquier caso es solo un detalle de implementación en el que no debe confiar.


Además, debe usar is para cosas como is None . Úselo para verificar si dos objetos, de las clases que diseñó, son la misma instancia. No puede usarlo fácilmente para cadenas o números porque las reglas para la creación de esas clases integradas son complejas. Algunas cadenas están internados. Algunos números, de manera similar, están internados.

Otros consejos

Esa página que ha citado dice " Si dos cadenas literales son iguales, se han colocado en la misma ubicación de memoria " (énfasis mío). Python pasa las cadenas literales, pero las cadenas que se devuelven de alguna función arbitraria son objetos separados. El operador is puede considerarse como una comparación de puntero, por lo que dos objetos diferentes no se compararán como idénticos (incluso si contienen los mismos caracteres, es decir, son iguales).

Te has encontrado con el hecho de que Python no siempre pasa todas sus cadenas. Más detalles aquí:

http://mail.python.org/pipermail/tutor /2009-July/070157.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top