python - normalized - ¿Por qué `a== b o c o d` siempre se evalúa como Verdadero?
pandas plot (1)
En muchos casos, Python se ve y se comporta como el inglés natural, pero este es un caso donde la abstracción falla. La gente puede usar claves de contexto para determinar que "Jon" y "Inbar" son objetos unidos al verbo "igual", pero el intérprete de Python tiene una mentalidad más literal.
if name == "Kevin" or "Jon" or "Inbar":
es lógicamente equivalente a:
if (name == "Kevin") or ("Jon") or ("Inbar"):
Lo cual, para el usuario Bob, es equivalente a:
if (False) or ("Jon") or ("Inbar"):
El operador or
elige el primer argumento con un valor de verdad positivo:
if ("Jon"):
Y como "Jon" tiene un valor de verdad positivo, se ejecuta el bloque if
. Eso es lo que causa que se imprima "Acceso otorgado" independientemente del nombre dado.
Todo este razonamiento también se aplica a la expresión if "Kevin" or "Jon" or "Inbar" == name
. el primer valor, "Kevin"
, es verdadero, por lo if
se ejecuta el bloque if
.
Hay dos formas comunes de construir correctamente este condicional.
Use operadores múltiples
==
para verificar explícitamente cada valor:
if name == "Kevin" or name == "Jon" or name == "Inbar":
Componga una secuencia de valores válidos y use el operador
in
para probar la membresía:
if name in ("Kevin", "Jon", "Inbar"):
En general, se debe preferir el segundo, ya que es más fácil de leer y también más rápido:
In [1]: name = "Inbar"
In [2]: %timeit name == "Keven" or name == "Jon" or name == "Inbar"
10000000 loops, best of 3: 116 ns per loop
In [3]: %timeit name in ("Keven", "Jon", "Inbar")
10000000 loops, best of 3: 65.2 ns per loop
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo probar múltiples variables contra un valor? 13 respuestas
Estoy escribiendo un sistema de seguridad que niega el acceso a usuarios no autorizados.
import sys
print("Hello. Please enter your name:")
name = sys.stdin.readline().strip()
if name == "Kevin" or "Jon" or "Inbar":
print("Access granted.")
else:
print("Access denied.")
¡Concede acceso a usuarios autorizados como se esperaba, pero también permite el acceso de usuarios no autorizados!
Hello. Please enter your name:
Bob
Access granted.
¿Por qué ocurre esto? Simplemente dije que solo otorgaba acceso cuando el name
es igual a Kevin, Jon o Inbar. También probé la lógica opuesta, if "Kevin" or "Jon" or "Inbar" == name
, pero el resultado es el mismo.