Je crée un analyseur Python, et cela me déroute vraiment :
>>> 1 in [] in 'a'
False
>>> (1 in []) in 'a'
TypeError: 'in <string>' requires string as left operand, not bool
>>> 1 in ([] in 'a')
TypeError: 'in <string>' requires string as left operand, not list
Comment fonctionne exactement "in" en Python, en ce qui concerne l'associativité, etc.?
Pourquoi deux de ces expressions ne se comportent-elles pas de la même manière?
python
syntax
python-2.x
user541686
la source
la source
if a < b < c:
et de le faire fonctionner intuitivementin
à un opérateur de "comparaison", je suppose. : \Réponses:
1 in [] in 'a'
est évalué comme(1 in []) and ([] in 'a')
.Puisque la première condition (
1 in []
) estFalse
, la condition entière est évaluée commeFalse
;([] in 'a')
n'est jamais réellement évalué, donc aucune erreur n'est générée.Voici les définitions des instructions:
la source
[]
est faux, mais[]
ne l'est pasFalse
par exemple,[] and anything
retourne[]
(pasFalse
).Python fait des choses spéciales avec des comparaisons chaînées.
Les éléments suivants sont évalués différemment:
Dans les deux cas cependant, si la première comparaison est
False
, le reste de l'instruction ne sera pas examiné.Pour votre cas particulier,
Également pour illustrer la première règle ci-dessus, ce sont des instructions qui évaluent à True.
Préséance des opérateurs python: http://docs.python.org/reference/expressions.html#summary
la source
De la documentation:
Ce que cela signifie, c'est qu'il n'y a pas d'associativité
x in y in z
!Les éléments suivants sont équivalents:
la source
La réponse courte, puisque la longue est déjà donnée plusieurs fois ici et d'excellente manière, est que l'expression booléenne est court-circuitée , c'est a arrêté l'évaluation quand un changement de vrai en faux ou vice versa ne peut pas se produire par une évaluation plus poussée.
(voir http://en.wikipedia.org/wiki/Short-circuit_evaluation )
Cela peut être un peu court (sans jeu de mots) comme réponse, mais comme mentionné, toutes les autres explications sont déjà assez bien faites ici, mais je pensais que le terme méritait d'être mentionné.
la source