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

¡Esto no funciona! Tengo una variable y necesito que haga algo cuando es uno de los valores, pero no ingresará la declaración if. En Java if (var == "stringone" || "stringtwo") funciona. ¿Cómo escribo esto en Python?¿Cómo verificar si una variable es igual a una cadena u otra cadena?

+0

Estoy bastante seguro de que los dos errores se han cubierto anteriormente. –

+0

para la distinción is /==: http://stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is-fails-sometimes-why – tanantish

Respuesta

99

esto no hace lo que se espera:

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

Es lo mismo que:

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

que siempre es cierto, ya que 'stringtwo se considera un valor "verdadero".

hay dos alternativas:

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

o puede escribir tests de igualdad separadas,

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

no utilice is, porque is compara la identidad del objeto. Puede que se salga con la suya a veces porque Python hace muchas prácticas, al igual que puede salirse con la suya en Java porque Java interviene en muchas cadenas. Pero no use is a menos que realmente desee la identidad del objeto.

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

¡Muchas gracias! Esto ha solucionado muchos problemas en mi programa. :) –

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

'is' se utiliza para comprobar si las dos referencias se refieren a un mismo objeto. Compara la dirección de memoria. Aparentemente, 'stringone' y 'var' son objetos diferentes, solo contienen la misma cadena, pero son dos instancias diferentes de la clase 'str'. Entonces, por supuesto, tienen dos direcciones de memoria diferentes, y el 'es' devolverá False.

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

o más Pythonic,

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

coma faltada en el segundo – DSM

+0

@DSM dos puntos faltantes, también. – iMom0

+0

¿Por qué el segundo se considera más pitónico? –

0

Dos controles independientes. Además, use == en lugar de is para verificar la igualdad en lugar de la identidad.

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

¡No olvide votar! –

+0

No tengo suficiente reputación. Me acabo de unir a StackOverflow hoy. –

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

funciona para mí.

Cuestiones relacionadas