non
et le fait que tu penses que c'est presque un bug prouve que tu confonds deux choses qui n'ont rien à voir:
1) le typage
2) les détail, **non spécifiés**, d'implémentation du langage.
Le fait que python fasse ca:
https://docs.python.org/2/c-api/int.html
"the current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object."
est un détail d'implémentation/optimisation. I se peut très bien que ça change dans une version future de python et ça ne pose aucun problème puisque ce comportement n'est PAS dans la spécification de python. La spécification de python n'impose PAS ce que "is" doit renvoyer ou pas. Tu es libre de recoder un interpréteur python qui gère les petits entiers autrement.
Ca n'a rien à voir avec la définition du langage. "is" ne compare *************PAS************ deux entiers au sens "ont ils la même valeur" mais il teste le fait que deux objets soient (ou non) stockés au même endroit en mémoire et donc le fait que ce ne soit qu'un seul et même objet.
Le bug c'est d'utiliser "is" au lieu de "==".
Si tu veux parler de typage des entiers alors prenons python2.7 (pas 3.X) et regardons ca:
import sys
type(sys.maxsize)
<type 'int'>
type(sys.maxsize+1)
<type 'long'>
Hé oui, les entiers change de type (int devient long) en python2. Ca s'explique car les entiers sont des entiers machine 62bits en mémoire. En C, c'est tout ce qu'on a. Si on dépasse la valeur max qu'on peut stocker dans un entier 64bits, ca ne fait pas ce qu'on veut
En python, +1 sur sys.maxsize transforme ***automatiquement*** l'entier de type int en un entier de type long. Ca change tout en interne. Prenons l'exemple de l'addition. Tant que les valeurs tiennent dans un entier 64bits, c'est une instruction CPU qui s'en charge.
Quand on dépasse cette valeur, il faut déjà commencer par stocker le nombre dans autre chose que 64bits. On peut penser à le stocker comme une list de ses chiffres (nul niveau perfo mais possible...). Faire un "+" est alors un algo qui doit faire une additions sur des nombres représentés sous forme de list. Ca coute beaucoup plus de temps que le + 64bits du CPU....et c'est la même tisane pour toutes les opérations arithmétiques. Il est donc normal d'avoir deux types différents....mais c'est un peu étrange pour l’utilisateur donc, en python3, TOUS les entiers ont le même type. Sous le manteau, python traite les petits entiers différemment des grands pour des raisons de performances MAIS tous les entiers ont le même type. Ca montre encore une fois la différence entre l'implémentation d'un langage et sa spécification. SI la spec n'interdit pas tel ou tel comportement dans tel ou tel cas alors l'implémentation est libre de faire ce qu'il y a de mieux pour la performance.
"is" te permet d'aller voir dans le détail de python et de sa façon de gérer la mémoire. Ça n'a RIEN À voir avec le "=" des mathématiques.
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.