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.
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
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.