कई परिदृश्य हैं जो एक अलग संदर्भ गणना प्रदान करेंगे। सबसे सरल आरईपीएल सांत्वना है:
>>> import sys
>>> the_var = 'Hello World!'
>>> print(sys.getrefcount(the_var))
2
इस परिणाम को समझना बिल्कुल स्पष्ट है - स्थानीय ढेर में एक संदर्भ और एक अन्य अस्थायी/sys.getrefcount()
समारोह (यहां तक कि documentation इसके बारे में चेतावनी दी है करने के लिए स्थानीय है - The count returned is generally one higher than you might expect
)। लेकिन जब आप एक स्टैंडअलोन स्क्रिप्ट के रूप में इसे चलाने:
import sys
the_var = 'Hello World!'
print(sys.getrefcount(the_var))
# 4
के रूप में आप ध्यान दिया है, तो आप एक 4
मिलता है। तो क्या देता है? ठीक है, की सुविधा देता है की जांच ... वहाँ कचरा कलेक्टर करने के लिए एक बहुत ही उपयोगी इंटरफेस है - gc
मॉड्यूल - तो अगर हम आरईपीएल कंसोल में इसे चलाने: वहाँ
>>> import gc
>>> the_var = 'Hello World!'
>>> gc.get_referrers(the_var)
[{'__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'the_var': 'Hello
World!', 'gc': <module 'gc' (built-in)>, '__name__': '__main__', '__doc__': None}]
कोई चमत्कार, - कि अनिवार्य रूप से सिर्फ वर्तमान नाम स्थान है (locals()
) क्योंकि चर कहीं और मौजूद नहीं है। लेकिन क्या होता है जब हमारे द्वारा चलाए जा स्टैंडअलोन स्क्रिप्ट के रूप में:
import gc
import pprint
the_var = 'Hello World!'
pprint.pprint(gc.get_referrers(the_var))
इस बाहर प्रिंट (YMMV, अपने अजगर संस्करण पर आधारित):
[['gc',
'pprint',
'the_var',
'Hello World!',
'pprint',
'pprint',
'gc',
'get_referrers',
'the_var'],
(-1, None, 'Hello World!'),
{'__builtins__': <module '__builtin__' (built-in)>,
'__doc__': None,
'__file__': 'test.py',
'__name__': '__main__',
'__package__': None,
'gc': <module 'gc' (built-in)>,
'pprint': <module 'pprint' from 'D:\Dev\Python\Py27-64\lib\pprint.pyc'>,
'the_var': 'Hello World!'}]
पर्याप्त ज़रूर, हम सूची में दो और संदर्भ हो जैसे sys.getrefcount()
ने हमें बताया, लेकिन वे क्या हैं? खैर, जब पाइथन दुभाषिया आपकी स्क्रिप्ट को पार्स कर रहा है तो इसे पहले compile पर बाइटकोड की आवश्यकता होती है - और जब यह करता है, तो यह सभी स्ट्रिंग्स को एक सूची में संग्रहीत करता है, क्योंकि यह आपके चर का भी उल्लेख करता है, इसे संदर्भ के रूप में घोषित किया जाता है।
दूसरी और गुप्त प्रविष्टि ((-1, None, 'Hello World!')
) peep-hole optimizer से आता है और क्या वहां केवल एक्सेस (इस मामले में स्ट्रिंग संदर्भ) अनुकूलित है।
उन दोनों विशुद्ध रूप से अस्थायी और वैकल्पिक हैं - आरईपीएल सांत्वना संदर्भ जुदाई कर रही है ताकि आप इन संदर्भों को नहीं दिख रहा है, अगर आप अपने वर्तमान संदर्भ से अपने संकलन 'आउटसोर्स' के लिए गए थे:
import gc
import pprint
exec(compile("the_var = 'Hello World!'", "<string>", "exec"))
pprint.pprint(gc.get_referrers(the_var))
आप 'प्राप्त डी:
import sys
exec(compile("the_var = 'Hello World!'", "<string>", "exec"))
print(sys.getrefcount(the_var))
# 2
:
[{'__builtins__': <module '__builtin__' (built-in)>,
'__doc__': None,
'__file__': 'test.py',
'__name__': '__main__',
'__package__': None,
'gc': <module 'gc' (built-in)>,
'pprint': <module 'pprint' from 'D:\Dev\Python\Py27-64\lib\pprint.pyc'>,
'the_var': 'Hello World!'}]
और आप sys.getreferencecount()
के माध्यम से मूल का प्रयास करने के लिए वापस जाने के लिए थे, तो संदर्भ गिनती हो रही है पर
बस आरईपीएल कंसोल की तरह, और जैसा कि अपेक्षित था। Peep-hole अनुकूलन के कारण अतिरिक्त संदर्भ, क्योंकि यह जगह में होता है, तुरंत आपके संदर्भों की गणना करने से पहले कचरा संग्रह (gc.collect()
) को मजबूर कर त्याग दिया जा सकता है।
हालांकि, संकलन के दौरान बनाई गई स्ट्रिंग सूची को तब तक रिलीज़ नहीं किया जा सकता जब तक कि पूरी फ़ाइल को पार्स और संकलित नहीं किया जाता है, यही कारण है कि यदि आप अपनी स्क्रिप्ट को किसी अन्य स्क्रिप्ट में आयात करना चाहते हैं और फिर the_var
पर संदर्भों को गिनें आपको 4
के बजाय प्राप्त होगा जब आपने सोचा था कि यह आपको और भ्रमित नहीं कर सकता है;)
क्या आप इसे सीधे पाइथन या आईपीथॉन खोल में टाइप कर रहे हैं? या इसे एक स्टैंडअलोन स्क्रिप्ट के रूप में चला रहे हैं? मुझे सादे पायथन खोल में 2 संदर्भ मिलते हैं। – Meitham
जब मैं 2.7.13 में अपना कोड चलाता हूं तो मुझे 'Var बनाया गया: 2 संदर्भ' मिलता है। – Alex
मैं इंटरैक्टिव मोड में 2 संदर्भ, और 3 स्क्रिप्ट के रूप में (कोड ऑब्जेक्ट के स्थिरांक से संदर्भ के लिए एक अतिरिक्त) की अपेक्षा करता हूं, लेकिन 4 नहीं। आपने एक और संदर्भ बनाने के लिए कुछ और किया होगा। – user2357112