Question Comparaison de chaînes en Python: est vs == [doublon]


Cette question a déjà une réponse ici:

J'ai remarqué qu'un script Python que j'écrivais agissait de manière incontrôlable et que je l'ai tracé sur une boucle infinie, où la condition de la boucle était while line is not ''. En cours d'exécution dans le débogueur, il s'est avéré que la ligne était en fait ''. Quand je l'ai changé pour !='' plutôt que is not ''ça marchait bien

Aussi, est-il généralement préférable d'utiliser simplement "==" par défaut, même en comparant des valeurs int ou booléennes? J'ai toujours aimé utiliser 'is' parce que je le trouve plus esthétique et pythonique (c'est comme ça que je suis tombé dans ce piège ...), mais je me demande si il est destiné à être réservé à deux objets avec le même identifiant


451
2018-06-07 08:31


origine


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 d'habitude, 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 préférable de simplement utiliser '==' par défaut, même   lors de la comparaison de valeurs int ou booléennes?

Tu utilises == en comparant les valeurs et is lors de la comparaison des identités.

Lorsque vous comparez des ints (ou des types immuables en général), vous voulez presque toujours les premiers. Il y a une optimisation qui permet de comparer les petits entiers avec ismais ne comptez pas dessus.

Pour les valeurs booléennes, vous ne devriez pas faire de comparaison du tout. Au lieu de:

if x == True:
    # do something

écrire:

if x:
    # do something

Pour comparer contre None, is None est préféré à == None.

J'ai toujours aimé utiliser 'is' parce que   Je le trouve plus esthétique   et pythonique (c'est ainsi que je suis tombé   ce piège ...), mais je me demande si c'est   destiné à être réservé pour quand   vous vous souciez de trouver deux objets   avec le même id.

Oui, c'est exactement pour ça.


536
2018-06-07 08:53



Je voudrais montrer un petit exemple sur comment is et == sont impliqués dans des types immuables. 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

Tu devrais utiliser == en comparant les valeurs et is lors de la comparaison des identités. (De plus, du point de vue anglais, "est égal à" est différent de "est".)


232
2018-06-07 09:19



La logique n'est pas erronée. La déclaration

si x est y alors x == y est aussi vrai

devrait jamais être lu pour signifier

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_(logic)


62
2018-05-10 05:46



Voir Cette question

Votre logique en 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 cela ne s'applique PAS en sens inverse. == peut donner vrai alors is donne Faux.


25
2018-06-07 08:36