Existe-t-il un moyen d'obtenir le nombre de références actuel d'un objet en Python?
python
refcounting
GEOCHET
la source
la source
En utilisant le
gc
module, l'interface avec les tripes du ramasse-miettes, vous pouvez appelergc.get_referrers(foo)
pour obtenir une liste de tout ce qui fait référencefoo
.Par conséquent,
len(gc.get_referrers(foo))
vous donnera la longueur de cette liste: le nombre de référents, ce que vous recherchez.Voir également la
gc
documentation du module .la source
sys.getrefcount(object)
) est plus simple quelen(gc.get_referrers(foo))
si vous n'avez vraiment besoin que du nombre.Il y a
gc.get_referrers()
etsys.getrefcount()
. Mais, il est un peu difficile de voir commentsys.getrefcount(X)
pourrait servir l'objectif du comptage de références traditionnel. Considérer:import sys def function(X): sub_function(X) def sub_function(X): sub_sub_function(X) def sub_sub_function(X): print sys.getrefcount(X)
Puis
function(SomeObject)
livre «7»,sub_function(SomeObject)
livre «5»,sub_sub_function(SomeObject)
livre «3» etsys.getrefcount(SomeObject)
livre «2».En d'autres termes: si vous utilisez,
sys.getrefcount()
vous devez connaître la profondeur de l'appel de fonction. Cargc.get_referrers()
il faudra peut-être filtrer la liste des référents.Je proposerais de faire un comptage manuel des références à des fins telles que «isolement en cas de changement», c'est-à-dire «cloner si référencé ailleurs».
la source
import ctypes my_var = 'hello python' my_var_address = id(my_var) ctypes.c_long.from_address(my_var_address).value
ctypes prend l'adresse de la variable comme argument. L'avantage d'utiliser ctypes par rapport à sys.getRefCount est que vous n'avez pas besoin de soustraire 1 du résultat.
la source