J'ai un programme Python dans lequel deux variables prennent la valeur " public ". Dans une expression conditionnelle, j'ai la comparaison var1 est var2
qui échoue, mais si je la change en var1 == var2
, elle renvoie Vrai
.
Maintenant, si j'ouvre mon interpréteur Python et que je fais la même comparaison "est", elle réussit.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Qu'est-ce que je rate ici ?
is
est un test d'identité, ==
est un test d'égalité. Ce qui se passe dans votre code serait émulé dans l'interpréteur comme ceci :
>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False
donc, pas étonnant qu'ils ne soient pas les mêmes, non ?
En d'autres termes : est
est le id(a) == id(b)
Le mot-clé "is" permet de vérifier l'identité d'un objet, tandis que le mot "=" permet de comparer des valeurs.
Si vous utilisez is
, le résultat sera vrai si et seulement si l'objet est le même objet. En revanche, ==
sera vrai à chaque fois que les valeurs de l'objet seront les mêmes.
Je pense que cela a à voir avec le fait que, lorsque la comparaison 'is' est évaluée à false, deux objets distincts sont utilisés. Si elle vaut vrai, cela signifie qu'elle utilise en interne le même objet et n'en crée pas un nouveau, peut-être parce que vous les avez créés en une fraction de 2 secondes environ et que, comme il n'y a pas un grand intervalle de temps entre les deux, elle est optimisée et utilise le même objet.
C'est pourquoi vous devriez utiliser l'opérateur d'égalité ==
, et non is
, pour comparer la valeur d'un objet chaîne.
>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>>
Dans cet exemple, j'ai rendu s2, qui était un objet chaîne différent, précédemment égal à 'un' mais ce n'est pas le même objet que s
, parce que l'interpréteur n'a pas utilisé le même objet car je ne l'ai pas initialement assigné à 'un', si je l'avais fait, ils auraient été le même objet.