Comparaison des chaînes de caractères en Python: is vs. = = [dupliquer]
cette question a déjà une réponse ici:
j'ai remarqué qu'un script Python que j'écrivais agissait bizarrement, et je l'ai tracé à une boucle infinie, où la condition de la boucle était while line is not ''
. En le parcourant dans le débogueur, il s'est avéré que la ligne était en fait ''
. Quand je l'ai changé en !=''
plutôt que is not ''
, ça a bien marché.
de Plus, est-il généralement préférable d'utiliser '==' par défaut, même en comparant les valeurs int ou booléennes? J'ai toujours aimé utiliser "est" parce que je le trouve plus esthétique et pythonique (ce qui est comment je suis tombé dans ce piège...), mais je me demande si c'est prévu pour être réservé pour quand vous vous souciez de trouver deux objets avec le même id.
4 réponses
pour tous les objets Python intégrés (comme chaînes, listes, dicts, fonctions, etc.), si x est y, alors x==y est aussi Vrai.
pas toujours. NaN est un contre-exemple. Mais habituellement , l'identité ( is
) implique l'égalité ( ==
). L'inverse n'est pas vrai: Deux objets distincts peuvent avoir la même valeur.
aussi, est-il généralement considéré comme préférable de utilisez '==' par défaut, même en comparant les valeurs int ou booléennes?
vous utilisez ==
pour comparer des valeurs et is
pour comparer des identités.
quand on compare les ints (ou les types immuables en général), on veut presque toujours le premier. Il y a une optimisation qui permet de comparer les petits nombres entiers avec is
, mais ne comptez pas dessus.
pour les valeurs booléennes, vous ne devriez pas faire des comparaisons. Au lieu de:
if x == True:
# do something
écrire:
if x:
# do something
pour comparaison avec None
, is None
est préférable à == None
.
j'ai toujours aimé utiliser " est " parce que Je trouve ça plus esthétique et pythonic (qui est comment je suis tombé dans ce piège...), mais je me demande si c'est destiné à être réservé uniquement pour quand vous vous souciez de trouver deux objet avec le même id.
Oui, c'est exactement ça.
je voudrais montrer un petit exemple sur la façon dont is
et ==
sont impliqués dans immuable types. Essayez ça:
a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True
is
compare deux objets en mémoire, ==
compare leurs valeurs. Par exemple, vous pouvez voir que les petits entiers sont mis en cache par Python:
c = 1
b = 1
>>> b is c
True
vous devez utiliser ==
pour comparer les valeurs et is
pour comparer les identités. (Aussi, à partir d'un point de l'anglais vue, "égal" est différent de"est".)
La logique n'est pas défectueux. La déclaration
si x est y alors x= = y est aussi vrai
devrait jamais doit être interprété comme signifiant
si x==y alors x est y
c'est une erreur logique de la part du lecteur de supposer que l'inverse d'un énoncé logique est vrai. Voir http://en.wikipedia.org/wiki/Converse_(logique)
voir cette question
votre logique dans la lecture
pour tous les objets Python intégrés (comme chaînes, listes, dicts, fonctions, etc.), si x est y, alors x==y est aussi Vrai.
est légèrement défectueux.
si is
s'applique alors ==
sera vrai, mais il ne s'applique pas à l'inverse. ==
peut donner vrai tandis que is
renvoie False.