Existe uma maneira de obter a contagem de referência atual de um objeto em Python?
Respostas:
De acordo com a documentação do Python , o sysmódulo contém uma função:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Geralmente 1 maior do que o esperado, devido à referência do objeto arg temp.
Usando o gcmódulo, a interface para o coletor de lixo guts, você pode chamar gc.get_referrers(foo)para obter uma lista de tudo que se refere foo.
Portanto, len(gc.get_referrers(foo))fornecerá o comprimento dessa lista: o número de referenciadores, que é o que você procura.
Veja também a gcdocumentação do módulo .
sys.getrefcount(object)) é mais direta do que len(gc.get_referrers(foo))se você realmente só precisar do número.
Existe gc.get_referrers()e sys.getrefcount(). Mas, é meio difícil ver como sys.getrefcount(X)poderia servir ao propósito da contagem de referência tradicional. Considerar:
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)
Em seguida, function(SomeObject)entrega '7',
sub_function(SomeObject)entrega '5',
sub_sub_function(SomeObject)entrega '3' e
sys.getrefcount(SomeObject)entrega '2'.
Em outras palavras: se você usar, sys.getrefcount()deve estar ciente da profundidade da chamada de função. Para gc.get_referrers()um pode ter para filtrar a lista de referências.
Eu proporia fazer a contagem de referência manual para fins como “isolamento na mudança”, ou seja, “clonar se houver referência em outro lugar”.
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypes leva o endereço da variável como um argumento. A vantagem de usar ctypes em vez de sys.getRefCount é que você não precisa subtrair 1 do resultado.