Existe uma maneira de obter a contagem de referência atual de um objeto em Python?
python
refcounting
GEOCHET
fonte
fonte
Usando o
gc
módulo, a interface para o coletor de lixo guts, você pode chamargc.get_referrers(foo)
para obter uma lista de tudo que se referefoo
.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 .fonte
sys.getrefcount(object)
) é mais direta do quelen(gc.get_referrers(foo))
se você realmente só precisar do número.Existe
gc.get_referrers()
esys.getrefcount()
. Mas, é meio difícil ver comosys.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' esys.getrefcount(SomeObject)
entrega '2'.Em outras palavras: se você usar,
sys.getrefcount()
deve estar ciente da profundidade da chamada de função. Paragc.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”.
fonte
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.
fonte