Oltre alle altre risposte che menzionano la precedenza di not
è inferiore a in
, in realtà la tua affermazione equivale a:
not (True in [False, True])
Ma nota che se non separi la tua condizione dalle altre, python utilizzerà 2 ruoli ( precedence
o chaining
) per separarla, e in questo caso python ha usato la precedenza. Inoltre, tieni presente che se vuoi separare una condizione devi mettere tutta la condizione tra parentesi non solo l'oggetto o il valore:
(not True) in [False, True]
Ma come detto, c'è un'altra modifica di Python sugli operatori che sta concatenando :
Basato sulla documentazione di Python :
Si noti che confronti, test di appartenenza e test di identità hanno tutti la stessa precedenza e dispongono di una funzione di concatenamento da sinistra a destra , come descritto nella sezione Confronti.
Ad esempio, il risultato della seguente dichiarazione è False
:
>>> True == False in [False, True]
False
Perché python incatenerà le istruzioni come segue:
(True == False) and (False in [False, True])
Che è esattamente False and True
quello che è False
.
Si può presumere che l'oggetto centrale sarà condiviso tra 2 operazioni e altri oggetti (False in questo caso).
E nota che è vero anche per tutti i confronti, inclusi i test di appartenenza e le operazioni di test di identità che stanno seguendo gli operandi:
in, not in, is, is not, <, <=, >, >=, !=, ==
Esempio :
>>> 1 in [1,2] == True
False
Un altro esempio famoso è l'intervallo di numeri:
7<x<20
che è uguale a:
7<x and x<20