Darren Thomas donne une bonne réponse. Cependant, une grande différence entre les approches Java et Python est qu'avec le comptage de références dans le cas commun (pas de références circulaires), les objets sont nettoyés immédiatement plutôt qu'à une date ultérieure indéterminée.
Par exemple, je peux écrire du code bâclé et non portable en CPython, tel que
def parse_some_attrs(fname):
return open(fname).read().split("~~~")[2:4]
et le descripteur de fichier pour le fichier que j'ai ouvert sera nettoyé immédiatement car dès que la référence au fichier ouvert disparaît, le fichier est ramassé et le descripteur de fichier est libéré. Bien sûr, si j'exécute Jython ou IronPython ou éventuellement PyPy, le ramasseur d'ordures ne sera pas nécessairement lancé avant beaucoup plus tard ; il est possible que je sois à court de descripteurs de fichiers avant et que mon programme plante.
Donc vous DEVRIEZ écrire du code qui ressemble à
def parse_some_attrs(fname):
with open(fname) as f:
return f.read().split("~~~")[2:4]
mais les gens aiment parfois compter sur le comptage de références pour toujours libérer leurs ressources, car cela peut parfois rendre votre code un peu plus court.
Je dirais que le meilleur ramasseur de déchets est celui qui offre les meilleures performances, ce qui semble être actuellement les ramasseurs de déchets générationnels de style Java qui peuvent s'exécuter dans un thread séparé et ont toutes ces optimisations folles, etc. Les différences dans la façon dont vous écrivez votre code devraient être négligeables et idéalement inexistantes.