Ils donnent toujours le même résultat.
En fait, not 'ham' in 'spam and eggs'
semble être spécial tubé pour effectuer un simple "non", plutôt que "dans" opération et en niant le résultat:
>>> import dis
>>> def notin():
'ham' not in 'spam and eggs'
>>> dis.dis(notin)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not_in():
not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not__in():
not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def noteq():
not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 2 (==)
9 UNARY_NOT
10 POP_TOP
11 LOAD_CONST 0 (None)
14 RETURN_VALUE
J'avais pensé au début qu'ils ont toujours donné le même résultat, mais qu' not
sur son propre était tout simplement un faible priorité logique de la négation de l'opérateur, qui pourrait être appliquée à d' a in b
aussi facilement que toute autre expression booléenne, alors qu' not in
a été séparé de l'opérateur pour plus de commodité et de clarté.
Le démontage ci-dessus a été révélateur! Il semble que tout not
est de toute évidence une logique opérateur de négation, de la forme not a in b
est spécial emballé de sorte qu'il n'est pas réellement en utilisant le général d'opérateur. Cela rend not a in b
littéralement la même expression que a not in b
, plutôt que de simplement une expression qui donne la même valeur.