>>> 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
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 :-!-)
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 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 :-!-)
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
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.
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.