क्या पायथन में किसी वस्तु की वर्तमान रेफरी संख्या प्राप्त करने का एक तरीका है?


93

क्या पायथन में किसी वस्तु की वर्तमान रेफरी संख्या प्राप्त करने का एक तरीका है?

जवाबों:


109

पायथन प्रलेखन के अनुसार , sysमॉड्यूल में एक फ़ंक्शन होता है:

import sys
sys.getrefcount(object) #-- Returns the reference count of the object.

आम तौर पर 1 से अधिक आप उम्मीद कर सकते हैं, क्योंकि वस्तु arg अस्थायी संदर्भ।


आधिकारिक दस्तावेज से लिंक करें: docs.python.org/2/library/sys.html#sys.getrefcount
moi

64

gcमॉड्यूल का उपयोग करते हुए , कचरा इकट्ठा करने वाले के लिए इंटरफ़ेस, आप कॉल कर सकते हैं, gc.get_referrers(foo)जिसमें से संदर्भित सभी चीज़ों की एक सूची मिल सकती है foo

इसलिए, len(gc.get_referrers(foo))आपको उस सूची की लंबाई देगा: रेफरल की संख्या, जो कि आप के बाद की है।

gcमॉड्यूल प्रलेखन भी देखें ।


7
यह भी उल्लेख किया जाना चाहिए कि गणना +1 होगी, क्योंकि जीसी सूची ऑब्जेक्ट को संदर्भित करती है, भी।
रिचर्ड लेवासेयूर

1
मुझे लगता है कि @ जवाब सही है: >>> आयात gc >>> वर्ग बार (): ... पास ... >>> b = बार () >>> len (gc.get_referrers (b)) 1 >>> gc.get_referrers (ख) [{ 'बी': <0x7f1f010d0e18 पर __ main__.Bar उदाहरण>, 'बार': <वर्ग मुख्य 0x7f1f010d6530 पर .Bar>, ' builtins ': <मॉड्यूल ' निर्मित ' (अंतर्निहित )>>, ' पैकेज ': कोई नहीं, 'gc': <मॉड्यूल 'gc' (बिल्ट-इन)>, ' name ': name main ’, ' doc ’: कोई नहीं}]
हॉक

2
@ तेवन का जवाब ( sys.getrefcount(object)) की तुलना में अधिक सीधा है len(gc.get_referrers(foo)), अगर आपको वास्तव में केवल संख्या की आवश्यकता है।
Moi

Android के qpython3 में, यह गलत उत्तर देता है। हर बार।
शिहाब शहरियार खान

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 के कार्यान्वयन विवरणों पर निर्भर करता है: ऑब्जेक्ट का पता होने के कारण आईडी और एक PyObject का सटीक मेमोरी लेआउट। यदि आवश्यक हो तो बस getrefcount () से 1 को हटा दें।
EAD
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.