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 sysmodule 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 gcmodule, 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 gcdocumentation 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.