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 sys
mó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 gc
mó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 gc
documentaçã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.