Domanda

Sto tentando di confrontare due stringhe con è . Una stringa viene restituita da una funzione e l'altra è appena dichiarata nel confronto. è test per l'identità dell'oggetto, ma secondo questa pagina , funziona anche con due stringhe identiche a causa dell'ottimizzazione della memoria di Python. Ma quanto segue non funziona:

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'

L'output:

type 'str'
theuser
failed
ok

Suppongo che la ragione di ciò sia che una stringa restituita da una funzione è un tipo diverso di "quotazione"; di stringa di una stringa letterale. Esiste un modo per ottenere una funzione per restituire una stringa letterale? So che potrei usare == , ma sono solo curioso.

È stato utile?

Soluzione

Il sito che citi dice questo:

  

Se due letterali di stringa sono uguali, sono stati messi nella stessa posizione di memoria.

Ma

uSplit('theuser!host')

non è una stringa letterale, è il risultato di un'operazione sul 'theuser! host' letterale.

In ogni caso, di solito non dovresti verificare la parità delle stringhe usando è , perché questa ottimizzazione della memoria è in ogni caso solo un dettaglio di implementazione su cui non dovresti fare affidamento.


Inoltre, dovresti usare is per cose come is None . Usalo per verificare se due oggetti - delle classi che hai progettato - sono la stessa istanza. Non puoi usarlo facilmente per stringhe o numeri perché le regole per la creazione di quelle classi integrate sono complesse. Alcune stringhe sono internate. Alcuni numeri, allo stesso modo, sono internati.

Altri suggerimenti

Quella pagina che hai citato dice " Se due stringhe letterali sono uguali, sono state messe nella stessa posizione di memoria " (enfasi la mia). Python esegue il interning di stringhe letterali, ma le stringhe restituite da alcune funzioni arbitrarie sono oggetti separati. L'operatore is può essere considerato come un confronto puntatore, quindi due oggetti diversi non comparano come identici (anche se contengono gli stessi caratteri, cioè sono uguali).

Quello che hai incontrato è il fatto che Python non esegue sempre internamente tutte le sue stringhe. Maggiori dettagli qui:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top