web-dev-qa-db-fra.com

Faux ou aucun vs aucun ou faux

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

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

Ce comportement me confond. Quelqu'un pourrait-il m'expliquer pourquoi cela se produit comme ça? Je m'attendais à ce qu'ils se comportent tous les deux de la même manière.

57
Virgiliu

L'expression x or y correspond à x si x est vrai, ou y si x est faux.

Notez que "vrai" et "faux" dans la phrase ci-dessus parlent de "véracité", pas des valeurs fixes True et False. Quelque chose de "vrai" fait réussir une instruction if; quelque chose de "faux" le fait échouer. les valeurs "fausses" incluent False, None, 0 et [] (une liste vide).

78
RichieHindle

L'opérateur "ou" renvoie la valeur de son premier opérande, si cette valeur est vraie au sens booléen pythonique (alias sa "véracité"), sinon il retourne la valeur de son deuxième opérande, quel qu'il soit. Voir la sous-section intitulée Opérations booléennes dans la section sur Expressions dans le documentation en ligne actuelle .

Dans les deux exemples, le premier opérande est considéré comme faux, donc la valeur du second devient le résultat de l'évaluation de l'expression.

10
martineau

Vous devez comprendre que None, False et True sont tous des singletons.

Par exemple, if foo is not None signifie que foo a une valeur autre que None. Cela fonctionne comme avoir simplement if foo qui est essentiellement if foo == True.

Alors, not None et True fonctionnent de la même manière. De plus, None et False fonctionnent de la même manière.

>>> 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

La chose importante à réaliser et à prendre en compte lors du codage est que lors de la comparaison de deux choses, None a besoin is, mais True et False a besoin ==. Éviter if foo == None et ne faites que if foo is None et évitez if foo != None et ne faites que if foo is not None. Dans le cas de if foo is not None, faites simplement if foo. Dans le cas de if foo is None, faites simplement if not foo.

Remarque: True est essentiellement 1 et False est essentiellement 0. Dans l'ancien temps de Python, nous n'avions que 1 pour une valeur true et nous avions 0 pour une valeur false. Il est plus compréhensible et plus convivial de dire True au lieu de 1 et plus compréhensible et convivial pour dire False au lieu de 0.

5
Boštjan Mejak

Un sujet étroitement lié: or et andcourt-circuit de Python. Dans une opération logique or, si un argument est vrai, alors tout est vrai et rien d'autre n'a besoin d'être évalué; Python retourne rapidement cette "vraie" valeur. Si elle se termine et que rien n'était vrai, elle renvoie le dernier argument qu'elle a traité, qui sera une "fausse" valeur.

and est l'inverse, s'il voit des fausses valeurs, il quittera rapidement avec cette "fausse" valeur, ou s'il passe à travers tout, retourne la "vraie" valeur finale.

>>> 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
4
Nick T

D'un point de vue booléen, ils se comportent tous les deux de la même manière, tous deux renvoient une valeur évaluée à false.

or "réutilise" simplement les valeurs qui lui sont données, en retournant celle de gauche si c'était vrai et celle de droite sinon.

1
sth
Condition1 or Condition2

si Condition1 est False, évaluez et retournez Condition2. Aucun n'est évalué comme faux.

0
Andrey Gubarev