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.

460
demandé sur Coquelicot 2010-06-07 12:31:49

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.

545
répondu dan04 2014-04-29 11:53:00

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".)

233
répondu pygabriel 2016-12-07 10:14:49

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)

62
répondu xubio 2013-05-10 05:46:26

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.

25
répondu pycruft 2017-05-23 12:34:37