526 votes

Comparaison en Python de chaînes : est vs. ==

J'ai remarqué un script en Python j'ai écrit a été agissant écureuils, et relié à une boucle infinie, où la condition de la boucle a été while line is not ''. Courir à travers elle dans le débogueur, il s'est avéré que la ligne était, en fait, ''. Quand je l'ai changé pour !='' plutôt que d' is not '', il a bien fonctionné.

Aussi, il est généralement préférable d'utiliser le '==' par défaut, même lors de la comparaison des int ou des valeurs Booléennes? J'ai toujours aimé l'utilisation de '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 prévu pour être réservé pour quand vous vous souciez de trouver deux objets avec le même id.

592voto

dan04 Points 33306

Pour tous intégrés dans des objets Python (comme les chaînes, les listes, les dicts, les fonctions,les etc.), si x est y, alors x==y est aussi Vrai.

Pas toujours. NaN est un contre-exemple. Mais généralement, l'identité (is) implique l'égalité (==). L'inverse n'est pas vrai: Deux objets distincts peuvent avoir la même valeur.

Aussi, il est généralement préférable d'utiliser le '==' par défaut, même lors de la comparaison des int ou des valeurs Booléennes?

Vous utilisez == lors de la comparaison des valeurs et de l' is lorsque l'on compare les identités.

Lorsque l'on compare les ints (ou immuable types en général), vous voulez toujours l'ancien. Il y a une optimisation qui permet aux petits nombres à comparer avec is, mais ne comptez pas sur elle.

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 comparer par rapport None, is None qui est privilégiée == None.

J'ai toujours aimé l'utilisation de '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 prévu pour être réservée pour les cas d' vous vous souciez de trouver deux objets avec le même id.

Oui, c'est exactement ce qu'il est.

253voto

pygabriel Points 3678

Je voudrais montrer un petit exemple sur la façon et sont impliqués dans les types immuables, essayer ça :

est compare deux objets en mémoire, == compare leurs valeurs, par exemple, vous pouvez voir que les petits entiers sont mis en cache par python :

Vous devez utiliser == lorsqu’en comparant les valeurs et lorsque l'on compare les identités. (aussi, d’un point de vue anglais, equals est différent d’est)

68voto

xubio Points 98

La logique n’est pas viciée. L’instruction

Si x est y alors x == y vaut également

doivent jamais être compris comme signifiant

Si x == y, alors x est y

C’est une erreur logique de la part du lecteur de supposer que la réciproque d’une instruction logique est vraie. Voir http://en.wikipedia.org/wiki/Converse _(logic)

26voto

pycruft Points 8095

Voir Cette question

Votre logique dans la lecture

Pour tous intégrés dans des objets Python (comme les chaînes, les listes, les dicts, les fonctions,les etc.), si x est y, alors x==y est aussi Vrai.

est un peu imparfait.

Si is s'applique == sera Vrai, mais il ne s'applique PAS dans le sens inverse. == le rendement peut être Vraie alors is rendements Faux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X