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

Comptage de références & cycles Reference counting & cycles

Le n°24 a mentionné une référence faible, sans expliquer ce qui distingue une référence forte. La réponse ouvre le dernier volume de la série : chaque objet Python porte un compteur de références, et meurt à l'instant précis où ce compteur atteint zéro — sauf quand deux objets se référencent mutuellement, et qu'aucun compteur ne redescend jamais à zéro tout seul. Issue №24 mentioned a weak reference, without explaining what sets a strong reference apart. The answer opens the series' final volume: every Python object carries a reference count, and dies at the exact instant that count hits zero — except when two objects reference each other, and no count ever drops to zero on its own.

AudienceAudience
Dev qui pense que Python a un garbage collector "comme Java" et ne sait pas que la plupart des objets meurent instantanément, sans lui Dev who thinks Python has a garbage collector "like Java" and doesn't know most objects die instantly, without it
Format
Self-paced
ChapitresChapters
5
Date
Juil 2026 Jul 2026
≈ 20 min ●●●● RefcountGarbage collector__del__

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

Un objet Python ne meurt pas « à un moment donné » — il meurt à l'instant exact où son compteur touche zéro.A Python object doesn't die "at some point" — it dies at the exact instant its counter hits zero.

Le numéro précédent a mentionné une référence faible, sans expliquer ce qui la distingue d'une référence forte — la voici. Chaque objet Python porte un entier caché, son compteur de références, qui s'incrémente à chaque nouvelle référence forte créée vers lui (une variable, un élément de liste, un attribut) et se décrémente à chaque suppression. La règle est mécanique et immédiate : dès que ce compteur atteint zéro, l'objet est détruit sur-le-champ, sa mémoire libérée, sans attendre le passage d'un quelconque ramasse-miettes différé. C'est très différent du modèle « tas balayé périodiquement » d'autres langages à garbage collector — en CPython, la libération de la plupart des objets est déterministe et instantanée.The previous issue mentioned a weak reference, without explaining what sets it apart from a strong one — here it is. Every Python object carries a hidden integer, its reference count, which increments with every new strong reference created toward it (a variable, a list element, an attribute) and decrements with every deletion. The rule is mechanical and immediate: as soon as that count hits zero, the object is destroyed on the spot, its memory freed, without waiting for any deferred garbage collector to pass by. This is very different from the 'heap swept periodically' model of other garbage-collected languages — in CPython, the release of most objects is deterministic and instantaneous.

__del__ s'exécute au moment exact où le compteur atteint zéro__del__ runs at the exact moment the counter hits zero
import sys

class Ressource:
    def __del__(self):
        print("Ressource libérée")

r = Ressource()
print(sys.getrefcount(r) - 1)   # -1 pour l'argument temporaire de l'appel : 1

r2 = r                            # une deuxième référence
print(sys.getrefcount(r) - 1)    # 2

del r2                            # une référence en moins
print(sys.getrefcount(r) - 1)    # 1

del r
# "Ressource libérée" s'affiche ICI, à l'instant précis du second del --
# pas "à un moment donné", pas "au prochain passage du GC" : maintenant,
# parce que le compteur de références vient d'atteindre zéro
Le réflexe du numéroThis issue's reflex

Une référence forte compte pour le refcount ; une référence faible (weakref, ou celle que la boucle asyncio garde sur une Task, n°24) n'y participe jamais.A strong reference counts toward refcount; a weak reference (weakref, or the one the asyncio loop keeps on a Task, issue №24) never participates in it.

🔒

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