Re: De la mauvaise utilisation de 'is' et '==' ...
Salvatore a écrit :
> Bonjour la communauté,
>
> Voici un petit bout de code qui m'intrigue,
>
>
> >>> v = 'TEST'
> >>> if not v is 'TEST':
if v is not 'TEST'
aurais été plus lisible AMHA.
Ceci étant dit, l'opérateur 'is' sert à tester l'identité de deux
objets, et non leur égalité. C'est en fait le strict équivalent de :
if id(v) != id('TEST')
Et ce n'est en aucun cas l'opérateur qui convient pour la comparaison
que tu fais ici. Si tu veux tester une égalité de valeur, utilise
l'opérateur '=='.
Pour info, voici deux ou trois cas d'utilisation correcte de 'is':
a = 'TEST'
b = a
print a is b
c = None
print c is None:
def toto():
pass
d = toto
print d is toto
etc... Comme tu peux le constater, dans aucun de ces cas on ne teste
contre un litéral.
(snip)
> J'avoue que je ne comprend pas très bien le fonctionnement de
> l'opérateur 'is' dans ces tests.
> Manifestement le caractère '/' modifie son comportement
Manifestement, ta conclusion est (au moins partiellement) erronée. La
présence du slash ne modifie en rien le comportement de 'is', bien
qu'elle puisse modifier le résultat de ton test.
> Curieusement, je n'avais encore jamais été confronté à cette situation.
> Si quelqu'un a une explication, je suis preneur
Détail d'implémentation de CPython, qui tente autant que possible de
cacher certains objets immutables. Tu aurais pu avoir une surprise
similaire avec des entiers:
>>> a = 1
>>> print a is 1
True
>>> b = 1024*1024
>>> print b is 1024*1024
False
>>>
ou des expressions booléennes:
>>> print a == 1
True
>>> print (a == 1) is True
True
>>> print a == 1 is True
False
>>>
Bref, et pour résumer : utilise '==' pour une égalité de valeur, et 'is'
pour des identités d'objets.
HTH
|