Si je fais ça:
>>> False in [False, True]
True
Cela revient True
. Tout simplement parce que False
c'est dans la liste.
Mais si je le fais:
>>> not(True) in [False, True]
False
Cela revient False
. Considérant que not(True)
est égal à False
:
>>> not(True)
False
Pourquoi?
python
python-2.7
python-3.x
Texom512
la source
la source
not(True) in [False, True]
Réponses:
Priorité des opérateurs 2.x , 3.x . La priorité de
not
est inférieure à celle dein
. C'est donc équivalent à:Voici ce que tu veux:
Comme le souligne @Ben: il est recommandé de ne jamais écrire
not(True)
, préféreznot True
. Le premier le fait ressembler à un appel de fonction, tandis quenot
c'est un opérateur, pas une fonction.la source
not(True)
; préféreznot True
. Le premier le fait ressembler à un appel de fonction, d'où vient votre confusion; sinot
c'était une fonction,not(True) in ...
cela ne pouvait pas l'êtrenot ((True) in ...)
. Vous devez savoir que c'est un opérateur (ou vous vous retrouvez dans des situations comme celle-ci), vous devez donc l'écrire comme un opérateur, pas le déguiser en fonction.a + b*c + d
, c'est très mauvais d'écrirea+b * c+d
. Il ennot(True)
va de même pour cette mesure aussi.not True
. Écrivez à laFalse
place.not True
, vous écririez quelque chose commenot myfunc(x,y,z)
oùmyfunc
est une fonction qui retourneTrue
ouFalse
.not x in y
est évalué commex not in y
Vous pouvez voir exactement ce qui se passe en démontant le code. Le premier cas fonctionne comme prévu:
Le deuxième cas, évalué
True not in [False, True]
, qui estFalse
clairement:Ce que vous vouliez plutôt exprimer était
(not(True)) in [False, True]
, ce qui était prévuTrue
, et vous pouvez voir pourquoi:la source
dis
mais c'est une réponse très précieuse car elle montre que c'est réellementnot in
utiliséPriorité de l'opérateur.
in
se lie plus étroitement quenot
, donc votre expression est équivalente ànot((True) in [False, True])
.la source
Tout dépend de la priorité des opérateurs (
in
est plus fort quenot
). Mais il peut être facilement corrigé en ajoutant des parenthèses au bon endroit:l'écriture:
est le même que:
qui regarde si
True
est dans la liste et retourne le "non" du résultat.la source
Il évalue en tant que
not True in [False, True]
, qui renvoieFalse
carTrue
est en[False, True]
Si tu essayes
Vous obtenez le résultat attendu.
la source
Parallèlement aux autres réponses qui mentionnent la priorité de
not
est inférieure àin
, votre déclaration équivaut en fait à:Mais notez que si vous ne séparez pas votre condition des autres, python utilisera 2 rôles (
precedence
ouchaining
) afin de séparer cela, et dans ce cas, python a utilisé la priorité. Notez également que si vous souhaitez séparer une condition, vous devez mettre toutes les conditions entre parenthèses, pas seulement l'objet ou la valeur:Mais comme mentionné, il y a une autre modification par python sur les opérateurs qui enchaîne :
Basé sur la documentation de python :
Par exemple, le résultat de l'instruction suivante est
False
:Parce que python enchaînera les instructions comme suit:
Ce qui est exactement
False and True
ce qui estFalse
.Vous pouvez supposer que l'objet central sera partagé entre 2 opérations et d'autres objets (False dans ce cas).
Et notez que c'est également vrai pour toutes les comparaisons, y compris les tests d'appartenance et les opérations de tests d'identité qui sont des opérandes suivants:
Exemple :
Un autre exemple célèbre est la plage de nombres:
ce qui est égal à:
la source
Voyons cela comme une opération de vérification du confinement d'une collection:
[False, True]
c'est une liste contenant quelques éléments.L'expression
True in [False, True]
revientTrue
, commeTrue
un élément contenu dans la liste.Par conséquent,
not True in [False, True]
donne "l'opposé booléen",not
résultat de l'expression ci-dessus (sans aucune parenthèse pour préserver la priorité, commein
a une priorité plus grande que l'not
opérateur). Par conséquent,not True
résulteraFalse
.D'un autre côté
(not True) in [False, True]
,, est égal àFalse in [False, True]
, qui estTrue
(False
est contenu dans la liste).la source
Pour clarifier certaines des autres réponses, l'ajout de parenthèses après un opérateur unaire ne change pas sa priorité.
not(True)
ne fait pasnot
lier plus étroitement àTrue
. C'est juste un ensemble de parenthèses redondantesTrue
. C'est un peu comme(True) in [True, False]
. Les parenthèses ne font rien. Si vous voulez que la liaison soit plus serrée, vous devez mettre les parenthèses autour de l'expression entière, ce qui signifie à la fois l'opérateur et l'opérande, c'est-à-dire,(not True) in [True, False]
.Pour voir cela d'une autre manière, considérez
**
se lie plus étroitement que-
, c'est pourquoi vous obtenez le négatif de deux carrés, pas le carré de deux négatifs (qui serait positif de quatre).Et si vous vouliez le carré de deux négatifs? De toute évidence, vous ajouteriez des parenthèses:
Cependant, il n'est pas raisonnable de s'attendre à ce que
4
parce que
-(2)
c'est la même chose que-2
. Les parenthèses ne font absolument rien.not(True)
est exactement le même.la source