Pergunta

Eu estou tentando comparar duas cordas com é . Uma string é retornado por uma função, eo outro é apenas declarada na comparação. é testes de identidade de objeto, mas de acordo com desta página , ele também funciona com duas cordas idênticas por causa de otimização de memória de Python. Mas, o seguinte não 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'

A saída:

type 'str'
theuser
failed
ok

Eu estou supondo que a razão para isso é uma string retornado por uma função é um "tipo" diferente de corda que um literal string. Existe uma maneira de ter uma função para retornar um literal de cadeia? Eu sei que eu poderia usar == , mas estou apenas curioso.

Foi útil?

Solução

O site que você citar diz o seguinte:

Se duas strings literais são iguais, eles foram colocados à mesma posição de memória.

Mas

uSplit('theuser!host')

não é um literal string -. Que é o resultado de uma operação no 'theuser!host' literal

De qualquer forma, você geralmente não deve verificar a igualdade string usando is, porque esta otimização de memória em qualquer caso, é apenas um detalhe de implementação que você não deve confiar.


Além disso, você deve usar is para coisas como is None. Use-o para verificar se dois objetos - de classes que você projetou - são a mesma instância. Você não pode usá-la facilmente para strings ou números, porque as regras para a criação desses built-in aulas são complexas. Algumas cadeias estão internados. Alguns números, da mesma forma, estão internados.

Outras dicas

Essa página você citou diz: "Se duas cordas literais são iguais, eles foram colocados à localização mesma memória" (grifo meu). Python estagiários strings literais, mas cordas que são devolvidos a partir de uma função arbitrária são objetos separados. O operador is pode ser pensado como uma comparação ponteiro, assim dois objectos diferentes não irá comparar como idênticos (mesmo que eles contenham os mesmos caracteres, isto é. Que são iguais).

O que você correr para o fato de que Python nem sempre faz tudo estagiário de suas cordas. Mais detalhes aqui:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top