tutorial normalized histograma example python boolean boolean-expression

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.

  1. Use operadores múltiples == para verificar explícitamente cada valor:
    if name == "Kevin" or name == "Jon" or name == "Inbar":

  2. 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í:

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.