"is" retourne True au dessus de 257
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 !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte