Résolue

"is" retourne True au dessus de 257

# Opérateurs

Bonjour,


Simple petite question, en faisant mes tests sur l'opérateur "is", au-delà de 257 pour une comparaison de 2 variables (nombres entiers), cela me retourne True et les emplacements mémoires sont les mêmes, même s'il s'agit de grands nombres :


a = 18718161848
b = 18718161848
print(f"L'ID de A est {id(a)}")
print(f"L'ID de B est {id(b)}")
print(f"a is b : {a is b}")


J'obtiens ce résultat :


L'ID de A est 2153593018480
L'ID de B est 2153593018480
a is b : True


Comment cela se fait alors que mes nombres sur supérieurs à 256 ?


Merci d'avance !


Hello,


humm intéressant.


Tu verras que si tu fais le même test mais cette fois ci directement dans l'interpreteur, tu auras bien le résultat attendu.


En revanche effectivement quand tu fais ça directement dans un script il te donne le même id

Ce doit être une subtilité de Vscode ou autre. En gros si tu utilises l'interpreteur, quand tu fais la touche enter après a, il assigne l'espace mémoire et quand tu fais pareil avec b il assigne un différent. J'ai l'impression que quand tu fais les 2 directement dans le script il alloue le même espace mémoire. Comme si ton entier était une substitution de a et ensuite b.


Pour ce qui est du fiat qu'il alloue le même espace mémoire pour des nombres égaux si < 257 c'est une histoire d'optimisation faite par python.


Je te tiens au courant si j'arrive à expliquer cette subtilité avec le script.


Ah oui effectivement, je viens de faire le test avec mon interpréteur local en passant mes instructions une par une et j'ai bien le résultat attendu :


Python 3.9.12 (tags/v3.9.12:b28265d, Mar 23 2022, 23:52:46) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 18718161848
>>> b = 18718161848
>>> print(f"a is b : {a is b}")
a is b : False


Par contre, si je passe directement mon fichier .py en paramètre de ma commande Python, même résultat que sur VSCode :


$ python test_is.py
L'ID de A est 1989651699824
L'ID de B est 1989651699824
a is b : True


Le comportement est similaire sur des interpréteurs online type online-python.com ou l'interpréteur de programiz.


Au final en fouillant un peu et en tombant là où tombe tous au final (Stackoverflow), il y a une explication rationnelle à cela dans la réponse faite à ce poste : https://stackoverflow.com/questions/15171695/whats-with-the-integer-cache-maintained-by-the-interpreter


De ce que je comprend, c'est un processus d'optimisation fait par Python (je t'avouerai que mon Anglais n'est pas le plus parfait)



Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.