2010-10-12 21 views
36
In [20]: print None or False 
-------> print(None or False) 
False 

In [21]: print False or None 
-------> print(False or None) 
None 

Este comportamiento me confunde. ¿Podría alguien explicarme por qué sucede esto? Esperaba que ambos se comportaran de la misma manera.Falso o Ninguno vs. Ninguno o Falso

+2

http://stackoverflow.com/questions/2017230/why-arent-and-and-or-operators-in-python y muchos otros. –

+2

posible duplicación de operaciones ["Booleanas" en Python (es decir: el y/o los operadores)] (http://stackoverflow.com/questions/3826473/boolean-operations-in-python-ie-the-and-or- operadores) –

+0

@SilentGhost: Si None se considera igual que False, ¿por qué devuelve None en lugar de False? ¿No debería un RO aplicado a dos valores falsos devolver False? – yoshi

Respuesta

54

La expresión se evalúa como x or yx si x es cierto, o si yx es falso.

Tenga en cuenta que "verdadero" y "falso" en la oración anterior están hablando de "veracidad", no de los valores fijos True y False. Algo que es "verdadero" hace que una declaración if tenga éxito; algo que es "falso" lo hace fallar. Los valores "falsos" incluyen False, None, 0 y [] (una lista vacía).

+4

LOL, aplicación creativa del término recientemente acuñado [truthiness] (http://en.wikipedia.org/wiki/Truthiness), pero bastante apropiado aquí, es a pesar de los orígenes cuestionables. – martineau

+2

@martineau: Es un término mucho más antiguo en este sentido técnico. Colbert tiene más posibilidades de integrarlo que los programadores, pero él no es la única fuente. –

+2

Sí, aparentemente un * mucho * término más antiguo. En Wiktionary for Etymology indican "Primera atestiguada en 1824". Nunca he visto en usado el sentido técnico que @RichieHindle hizo, aunque tiene mucho sentido en este caso. – martineau

0

Desde un punto de vista booleano ambos se comportan igual, ambos devuelven un valor que se evalúa como falso.

or simplemente "reutiliza" los valores que se le dan, devolviendo el de la izquierda si fuera verdadero y el correcto de lo contrario.

0
Condition1 or Condition2 

si Condition1 es False, evalúa y devuelve Condition2. Ninguno se evalúa como Falso.

8

El "o" operador devuelve el valor de su primer operando, si ese valor es cierto en el sentido boolean Pythonic (también conocido como su "truthiness"), de lo contrario, devuelve el valor de su segundo operando, lo que sea que sea. Consulte la subsección titulada Boolean operations en la sección Expresiones en el current online documentation.

En ambos ejemplos, el primer operando se considera falso, por lo que el valor del segundo se convierte en el resultado de la evaluación de la expresión.

4

Un tema estrechamente relacionado: Python's or y andshort-circuit. En una operación lógica or, si cualquier argumento es verdadero, entonces todo será verdadero y nada más necesita ser evaluado; Python devuelve rápidamente ese valor "verdadero". Si termina y nada fue cierto, devuelve el último argumento que manejó, que será un valor "falso".

and es lo contrario, si ve valores falsos, saldrá puntualmente con ese valor "falso", o si pasa por todo, devuelve el valor final "verdadero".

>>> 1 or 2 # first value TRUE, second value doesn't matter 
1 
>>> 1 and 2 # first value TRUE, second value might matter 
2 
>>> 0 or 0.0 # first value FALSE, second value might matter 
0.0 
>>> 0 and 0.0 # first value FALSE, second value doesn't matter 
0 
+0

Estrictamente hablando, Python no cortocircuita las operaciones 'o' y 'y' porque no está forzado a evaluar a True o False, sino que devuelve los argumentos para que el usuario pueda aplicar la veracidad del objeto . En ese sentido, la respuesta de RichieHindie es muy clara: para o, devuelve el primer argumento si se evalúa como verdadero; de lo contrario, devuelve el segundo; para y, es el converso, devuelve el segundo si el primero se evalúa como verdadero, de lo contrario el primero. –

1

Usted debe darse cuenta de que None, False y True son los únicos.

Por ejemplo, if foo is not None significa que foo tiene algún valor que no sea None. Esto funciona igual que tener if foo que es básicamente if foo == True. Por ejemplo, not None y True funcionan de la misma manera. Además, None y False funcionan de la misma manera.

>>> foo = not None 
>>> bool(foo) 
True 
>>> foo = 5 # Giving an arbitrary value here 
>>> bool(foo) 
True 

>>> foo = None 
>>> bool(foo) 
False 
>>> foo = 5 # Giving an arbitrary value here 
>>> bool(foo) 
True 

Lo importante darse cuenta y estar al tanto de cuando la codificación es que cuando se comparan dos cosas, None necesita is, pero True y False== necesidad. Evite if foo == None y haga solo if foo is None y evite if foo != None y haga solo if foo is not None. En el caso de if foo is not None, simplemente haga if foo. En el caso de if foo is None, simplemente haga if not foo.

Nota: True es básicamente 1 y False es básicamente 0. En los viejos tiempos de Python, solo teníamos 1 para un valor verdadero y teníamos 0 para un valor de falso. Es más comprensible y amigable decir True en lugar de 1 y más comprensible y amigable para los humanos decir False en lugar de 0.

+0

"En el caso de' si foo no es None', simplemente haz 'if foo'": ten en cuenta que 'if foo' no es lo mismo que comprobar' None'! La instrucción 'if' convierte su expresión a' bool' primero, por lo que si 'foo == 0',' if foo' fallará. – Norrius

+0

Ninguno o False o 0 son lo mismo que se conserve la lógica. Simplemente mantén la misma lógica al codificar. Si le da a una variable el valor inicial de Ninguno, quédese revisando este valor más adelante en el código fuente con "if foo is None", pero eso es básicamente lo mismo que marcar "if not foo". Esto es versátil, así que usa lo que sientas que se ve mejor. –

+0

Solo señalo que esto "básicamente lo mismo" podría ser una fuente de errores sutiles. Supongamos que tiene 'def diversión (foo: str = None): if foo: bar'. Ahora, ¿qué pasa cuando alguien pasa una cadena vacía? Puede que no sea el resultado deseado si una cadena vacía es distinta de None en tu lógica. – Norrius

Cuestiones relacionadas