Vol. 9 — № 26
The Python Loop · KiosqueNewsstand
Blog  
Un atelier Python · Édition d'ApprentissageA Python Workshop · Learning Edition

Tout est objet, tout coûte Everything is an object, everything costs

Le Vol. I a posé is contre == sans jamais expliquer pourquoi a is b « marche » parfois. La réponse tenait dans ce numéro : CPython pré-alloue un cache de petits entiers et interne certaines chaînes au démarrage. a is b n'est vrai par coïncidence que pour les valeurs qui tombent dans ce cache — et se brise, sans prévenir, dès qu'on en sort. Vol. I posed is versus == without ever explaining why a is b sometimes 'works'. The answer was waiting in this issue: CPython preallocates a small-int cache and interns certain strings at startup. a is b is only true by coincidence for values that fall inside that cache — and breaks, without warning, the moment you step outside it.

AudienceAudience
Dev qui a vu a is b marcher en REPL avec de petits entiers et l'a généralisé, à tort, en code de production Dev who saw a is b work in the REPL with small integers and wrongly generalized it into production code
Format
Self-paced
ChapitresChapters
5
Date
Juil 2026 Jul 2026
≈ 19 min ●●●○ is vs ==InterningCPython

Chapitre 1 en accès libre — la suite (ch. 2 à 5) est réservée. Chapter 1 free to read — the rest (ch. 2–5) is members-only.

01CadrageFraming3 min

Le tout premier numéro de la série posait la règle sans jamais expliquer pourquoi elle semblait avoir des exceptions.The very first issue of the series stated the rule without ever explaining why it seemed to have exceptions.

Le n°01 a ouvert toute la série sur une distinction fondatrice : is compare l'identité de deux objets — sont-ils littéralement le même objet en mémoire, le même id() — tandis que == compare leur valeur. Mais une question restait en suspens : pourquoi deux entiers valant 256, calculés à l'exécution, sont-ils le même objet, alors que deux entiers valant 257 ne le sont pas, quand == aurait répondu True dans les deux cas sans exception ? La réponse tenait dans un détail d'implémentation de CPython jamais encore nommé : certains objets, en nombre volontairement limité, sont créés une seule fois au démarrage de l'interpréteur, puis partagés — jamais recréés — chaque fois que leur valeur revient dans le code. Deux petits entiers égaux à 256 ne sont donc pas seulement égaux : ce sont, littéralement, le même objet.Issue №01 opened the entire series with a founding distinction: is compares the identity of two objects — are they literally the same object in memory, the same id() — while == compares their value. But a question was left hanging: why are two integers worth 256, computed at runtime, the same object, while two integers worth 257 are not, when == would have answered True in both cases without exception? The answer lay in a CPython implementation detail never yet named: certain objects, in a deliberately limited number, are created exactly once at interpreter startup, then shared — never recreated — every time their value comes up again in the code. Two small integers equal to 256 aren't just equal, then: they are, literally, the same object.

La règle du n°01, confrontée à 256 et 257Issue №01's rule, faced with 256 and 257
# la règle du n°01, appliquée à des entiers calculés à l'exécution :
a = int("256")
b = int("256")
print(a is b)   # True -- "is" compare l'IDENTITÉ (id()), pas la valeur

a = int("257")
b = int("257")
print(a is b)   # False -- pourtant, == aurait donné True dans les deux cas

# (a = 257; b = 257 écrits tels quels dans un script donneraient True :
# le compilateur partage les constantes identiques d'un même bloc.)
# Mais pourquoi 256 se comporte-t-il différemment de 257 ?
# La réponse n'a jamais été donnée -- jusqu'à ce numéro.
La boucle se refermeThe loop closes

Ce numéro ne présente pas une nouvelle règle : il explique enfin celle posée au tout premier numéro de la série. Le prix invisible du dynamisme n'est jamais mieux visible qu'ici, dans une coïncidence d'implémentation prise, à tort, pour une garantie du langage.This issue doesn't introduce a new rule: it finally explains the one stated in the series' very first issue. The invisible price of dynamism is never more visible than here, in an implementation coincidence wrongly mistaken for a language guarantee.

🔒

La suite est réservée The rest is members-only

Le premier numéro est libre. Débloque tout The Python Loop — tous les volumes, à vie — pour 5 €, paiement unique. The first issue is free. Unlock all of The Python Loop — every volume, forever — for €5, one-time.

Retour au kiosqueBack to newsstand