क्या पायथन में किसी वस्तु की वर्तमान रेफरी संख्या प्राप्त करने का एक तरीका है?
जवाबों:
पायथन प्रलेखन के अनुसार , sys
मॉड्यूल में एक फ़ंक्शन होता है:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
आम तौर पर 1 से अधिक आप उम्मीद कर सकते हैं, क्योंकि वस्तु arg अस्थायी संदर्भ।
gc
मॉड्यूल का उपयोग करते हुए , कचरा इकट्ठा करने वाले के लिए इंटरफ़ेस, आप कॉल कर सकते हैं, gc.get_referrers(foo)
जिसमें से संदर्भित सभी चीज़ों की एक सूची मिल सकती है foo
।
इसलिए, len(gc.get_referrers(foo))
आपको उस सूची की लंबाई देगा: रेफरल की संख्या, जो कि आप के बाद की है।
gc
मॉड्यूल प्रलेखन भी देखें ।
sys.getrefcount(object)
) की तुलना में अधिक सीधा है len(gc.get_referrers(foo))
, अगर आपको वास्तव में केवल संख्या की आवश्यकता है।
नहीं है 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()
एक सन्दर्भदाता की सूची फ़िल्टर करना पड़ सकता है।
मैं "बदले पर अलगाव", "क्लोन अगर कहीं और संदर्भित" जैसे उद्देश्यों के लिए मैनुअल संदर्भ गणना करने का प्रस्ताव करता हूं ।
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 घटाना नहीं चाहिए।