2012-10-08 30 views
39
if var is 'stringone' or 'stringtwo': 
    dosomething() 

Questo non funziona! Ho una variabile e ne ho bisogno per fare qualcosa quando è uno dei valori, ma non entrerà nell'istruzione if. In Java if (var == "stringone" || "stringtwo") funziona. Come scrivo questo in Python?Come verificare se una variabile è uguale a una stringa o un'altra stringa?

+0

Sono abbastanza sicuro che entrambi gli errori siano stati trattati in precedenza. –

+0

per la distinzione is/==: http://stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is-fails-sometimes-why – tanantish

risposta

99

Questo non fa quello che ti aspetti:

if var is 'stringone' or 'stringtwo': 
    dosomething() 

E 'lo stesso di:

if (var is 'stringone') or 'stringtwo': 
    dosomething() 

che è sempre vero, dal momento 'stringtwo è considerato un valore "vero".

ci sono due alternative:

if var in ('stringone', 'stringtwo'): 
    dosomething() 

Oppure si può scrivere i test di uguaglianza separati,

if var == 'stringone' or var == 'stringtwo': 
    dosomething() 

non uso is, perché is confronta identità di un oggetto. Potresti farla franca a volte perché Python internizza un sacco di stringhe, proprio come potresti farla franca in Java perché Java mette a disposizione un sacco di stringhe. Ma non utilizzare is a meno che non si desideri realmente l'identità dell'oggetto.

>>> 'a' + 'b' == 'ab' 
True 
>>> 'a' + 'b' is 'abc'[:2] 
False # but could be True 
>>> 'a' + 'b' is 'ab' 
True # but could be False 
+0

Grazie mille! Questo ha risolto molti problemi nel mio programma. :) –

3
if var == 'stringone' or var == 'stringtwo': 
    dosomething() 

'is' è utilizzato per verificare se i due riferimenti sono riferiti a uno stesso oggetto. Confronta l'indirizzo di memoria. Apparentemente, 'stringone' e 'var' sono oggetti diversi, contengono solo la stessa stringa, ma sono due diverse istanze della classe 'str'. Quindi, ovviamente, hanno due indirizzi di memoria diversi e "is" restituirà False.

14
if var == 'stringone' or var == 'stringtwo': 
    do_something() 

o più divinatorio,

if var in ['string one', 'string two']: 
    do_something() 
+1

virgola mancante sul secondo – DSM

+0

@DSM due punti mancanti, pure. – iMom0

+0

Perché la seconda è considerata più pitone? –

0

due controlli separati. Inoltre, utilizzare == anziché is per verificare l'uguaglianza piuttosto che l'identità.

if var=='stringone' or var=='stringtwo': 
    dosomething() 
+1

Non dimenticarti di votare! –

+0

Non ho abbastanza reputazione. Mi sono appena iscritto a StackOverflow oggi. –

0
for a in soup("p",{'id':'pagination'})[0]("a",{'href': True}): 
     if createunicode(a.text) in ['<','<']: 
      links.append(a.attrMap['href']) 
     else: 
      continue 

funziona per me.

Problemi correlati