파이썬에서 객체의 현재 참조 수를 얻는 방법이 있습니까?


93

파이썬에서 객체의 현재 참조 수를 얻는 방법이 있습니까?

답변:



64

gc가비지 수집기 내장에 대한 인터페이스 인 모듈을 사용하여를 gc.get_referrers(foo)참조하는 모든 목록을 가져 오기 위해 호출 할 수 있습니다 foo.

따라서 len(gc.get_referrers(foo))해당 목록의 길이, 즉 당신이 추구하는 리퍼러 수를 제공합니다.

gc모듈 문서 도 참조하십시오 .


7
또한 gc 목록이 객체를 참조하기 때문에 카운트가 +1이 될 것임을 언급해야합니다.
Richard Levasseur

1
나는 대답이 맞다고 생각한다. >>> import gc >>> class Bar () : ... pass ... >>> b = Bar () >>> len (gc.get_referrers (b)) 1 >>> gc.get_referrers (b) [{ 'b': <__ main__.Bar instance at 0x7f1f010d0e18>, 'Bar': <class main .Bar at 0x7f1f010d6530>, ' builtins ': <module ' builtin '(built- in)>, ' package ': None, 'gc': <module 'gc'(built-in)>, ' name ': ' main ', ' doc ': None}]
Havok

2
@tehvan의 대답 ( sys.getrefcount(object))은 len(gc.get_referrers(foo))실제로 숫자 만 필요하면.
moi

Android의 qpython3에서는 잘못된 답변을 제공합니다. 매번.
Shihab Shahriar Khan

9

gc.get_referrers()sys.getrefcount(). 그러나 sys.getrefcount(X)전통적인 참조 계수의 목적에 어떻게 기여할 수 있는지보기는 어렵습니다 . 중히 여기다:

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)

그런 다음 function(SomeObject)'7',
sub_function(SomeObject)'5',
sub_sub_function(SomeObject)'3',
sys.getrefcount(SomeObject)'2'를 전달합니다.

즉, 사용하는 경우 sys.getrefcount()함수 호출 깊이를 알고 있어야합니다. 들어 gc.get_referrers()하나의 참조 자 목록을 필터링 할 수도 있습니다.

"변경시 격리", 즉 "다른 곳에서 참조되는 경우 복제"와 같은 목적으로 수동 참조 계산 을 수행 할 것을 제안합니다 .


5
import ctypes

my_var = 'hello python'
my_var_address = id(my_var)

ctypes.c_long.from_address(my_var_address).value

ctypes는 변수의 주소를 인수로 사용합니다. sys.getRefCount보다 ctypes를 사용하는 이점은 결과에서 1을 뺄 필요가 없다는 것입니다.


1
재미 있긴하지만이 메서드는 사용해서는 안됩니다. 1) 코드를 읽는 동안 아무도 이해하지 못합니다. 2) CPython의 구현 세부 사항에 따라 달라집니다. id는 개체의 주소이고 PyObject의 정확한 메모리 레이아웃입니다. 필요한 경우 getrefcount ()에서 1을 빼십시오.
EAD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.