की संदर्भ गणना को समझना यह बेहतर समझने का प्रयास है कि संदर्भ गिनती पाइथन में कैसे काम करती है।कक्षा परिवर्तनीय
चलिए एक कक्षा बनाते हैं और इसे तुरंत चालू करते हैं। उदाहरण के संदर्भ गिनती होगी 1
(getrefcount
प्रदर्शित करता है 2
क्योंकि यह की अपनी आंतरिक संरचना का संदर्भ उस वर्ग उदाहरण 1
द्वारा संदर्भ गिनती बढ़ रही है):
>>> from sys import getrefcount as grc
>>> class A():
def __init__(self):
self.x = 100000
>>> a = A()
>>> grc(a)
2
a
के आंतरिक चर x
है 2
संदर्भ:
>>> grc(a.x)
3
मुझे उम्मीद है कि इसे a
और A
की __init__
विधि द्वारा संदर्भित किया जाएगा। तब मैंने जांच करने का फैसला किया।
इसलिए मैंने __main__
नामस्थान में अस्थायी चर b
बनाया है ताकि वे x
चर का उपयोग कर सकें। यह 1
द्वारा रेफरी-संख्या में वृद्धि हुई यह 3
बन के लिए करने के लिए (उम्मीद के रूप में):
>>> del a
>>> grc(b)
3
तो अब देखते हैं:
>>> b = a.x
>>> grc(a.x)
4
तब मैं कक्षा उदाहरण और रेफरी गिनती 1
की कमी हुई हटाए गए 2
संदर्भ: एक b
है और एक A
(जैसा कि मैंने अपेक्षित था) है।
__main__
नामस्थान से A
हटाकर मुझे लगता है कि गिनती 1
से फिर से घटने की उम्मीद है।
>>> del A
>>> grc(b)
3
लेकिन यह नहीं होता है। A
कोई संदर्भ नहीं है या इसके उदाहरण 100000
का संदर्भ दे सकते हैं, लेकिन फिर भी नामस्थान में b
के अलावा किसी अन्य चीज़ द्वारा संदर्भित किया गया है।
तो, मेरा सवाल यह है कि b
के अलावा संदर्भित क्या है?
BrenBarn सुझाव दिया है कि मैं एक नंबर जो कहीं न कहीं आंतरिक रूप से संग्रहीत किया जा सकता है के बजाय object()
उपयोग करना चाहिए।
>>> class A():
def __init__(self):
self.x = object()
>>> a = A()
>>> b = a.x
>>> grc(a.x)
3
>>> del a
>>> grc(b)
2
उदाहरण a
हटाने के बाद b
जो बहुत तार्किक है के द्वारा केवल एक संदर्भ बन रही थीं।
एकमात्र चीज जिसे समझने के लिए छोड़ दिया गया है, यह 100000
नंबर के साथ ऐसा नहीं है।
मेरा अनुमान है, 'ए .__ dict__' करता है? –
@JakobBowyer लेकिन जब मैं 'ए' हटा देता हूं, तो 'ए .__ dict__' कचरा एकत्र किया जाना चाहिए क्योंकि इसे किसी भी चीज़ (जैसा कि मैं समझता हूं) द्वारा संदर्भित नहीं किया जाता है। – ovgolovin
यह उत्तर देखें: http://stackoverflow.com/questions/759740/unexpected-result-from-sys-getrefcount –