Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

De la mauvaise utilisation de 'is' et '==' ...

14 réponses
Avatar
Salvatore
Bonjour la communauté,

Voici un petit bout de code qui m'intrigue,


>>> v = 'TEST'
>>> if not v is 'TEST':
... print "v est different de 'TEST'"
... else:
... print "v est egal a 'TEST'"
...
v est egal a 'TEST'
>>>
>>>


>>> v = 'N/A'
>>> if not v is 'N/A':
... print "v est different de 'N/A'"
... else:
... print "v est egal a 'N/A'"
...
v est different de 'N/A'
>>>
>>> v != 'N/A'
False


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
Curieusement, je n'avais encore jamais été confronté à cette situation.
Si quelqu'un a une explication, je suis preneur

Cordialement

Salvatore

4 réponses

1 2
Avatar
William Dode
On 07-10-2007, Encolpe Degoute wrote:

Pour faire un équivalence au C, 'is' vérifie une référence.
Mais python est avare en mémoire: s'il peu utiliser le même objet deux
fois il le fait:


N'empêche qu'il serait intéressant de savoir pourquoi dans un cas il le
fait et pas dans un autre... Je pensais qu'en cpython c'était
systématique.

--
William Dodé - http://flibuste.net
Informaticien indépendant

Avatar
Salvatore
Merci pour cette explication Encolpe :-)
Avatar
Bruno Desthuilliers
On 07-10-2007, Encolpe Degoute wrote:

Pour faire un équivalence au C, 'is' vérifie une référence.
Mais python est avare en mémoire: s'il peu utiliser le même objet deux
fois il le fait:


N'empêche qu'il serait intéressant de savoir pourquoi dans un cas il le
fait et pas dans un autre...




Je pensais qu'en cpython c'était
systématique.


Non. En ce qui concerne les nombres, par exemple, seuls les 'petits'
(pour une valeur de 'petit' variant selon les versions de CPython) sont
cachés - il y a statistiquement beaucoup plus de chances d'utiliser des
petits nombres que des grands dans un programme pris au hasard.

Pour ce qui est des chaines, je n'ai aucune idée des critères de mise en
cache. Mais c'est facile de savoir : Use the code, Luke :-!-)


Avatar
Amaury Forgeot d'Arc
On 07-10-2007, Encolpe Degoute wrote:

Pour faire un équivalence au C, 'is' vérifie une référence.
Mais python est avare en mémoire: s'il peu utiliser le même objet deux
fois il le fait:


N'empêche qu'il serait intéressant de savoir pourquoi dans un cas il
le fait et pas dans un autre...




Je pensais qu'en cpython c'était systématique.


Non. En ce qui concerne les nombres, par exemple, seuls les 'petits'
(pour une valeur de 'petit' variant selon les versions de CPython) sont
cachés - il y a statistiquement beaucoup plus de chances d'utiliser des
petits nombres que des grands dans un programme pris au hasard.

Pour ce qui est des chaines, je n'ai aucune idée des critères de mise en
cache. Mais c'est facile de savoir : Use the code, Luke :-!-)


Pour l'avoir déjà lu une fois, il semble que ce code est réparti un peu
partout. Python met en cache (c'est la fonction "intern", disponible en
python):
- les chaines de longueur 0 et 1, d'où qu'elles viennent
- les chaines "en dur" dans le code qui ne contiennent que des lettres
ou de chiffres
- les noms de variables, d'attributs...

Bref, tout ce qui a des chances d'apparaître à plusieurs endroits.

--
Amaury



1 2