Existe-t-il un moyen d'obtenir le nombre de références actuel d'un objet en Python?
Réponses:
Selon la documentation Python , le sys
module contient une fonction:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Généralement 1 supérieur à ce à quoi vous pourriez vous attendre, en raison de la référence temp de l'objet arg.
En utilisant le gc
module, l'interface avec les tripes du ramasse-miettes, vous pouvez appeler gc.get_referrers(foo)
pour obtenir une liste de tout ce qui fait référence foo
.
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 .
sys.getrefcount(object)
) est plus simple que len(gc.get_referrers(foo))
si vous n'avez vraiment besoin que du nombre.
Il y a gc.get_referrers()
et sys.getrefcount()
. Mais, il est un peu difficile de voir comment sys.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» et
sys.getrefcount(SomeObject)
livre «2».
En d'autres termes: si vous utilisez, sys.getrefcount()
vous devez connaître la profondeur de l'appel de fonction. Car gc.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».
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.