2012-04-24 16 views
12

मैं समझता हूँ के रूप में, sys.getrefcount() एक वस्तु है, जो निम्नलिखित मामले में 1 हो "चाहिए" के सन्दर्भ की संख्या देता है:sys.getrefcount() 2 वापस क्यों करता है?

import sys,numpy 
a = numpy.array([1.2,3.4]) 
print sys.getrefcount(a) 

हालांकि, यह पता चला 2 हो सकता है! तो, अगर मैं:

del a 

"numpy.array ([1.2,3.4])" वस्तु अभी भी वहाँ हो जाएगा (कोई कचरा संग्रहण)?

+1

आप एक सरल प्रदर्शन का निर्माण कर सकते हैं: x = 1.1; प्रिंट sys.getrefcount (x) –

उत्तर

20

जब आप getrefcount() पर कॉल करते हैं, तो संदर्भ को फ़ंक्शन के तर्क में मूल्य द्वारा प्रतिलिपि बनाई जाती है, अस्थायी रूप से ऑब्जेक्ट की संदर्भ गणना को बढ़ाती है। यह वह जगह है जहां दूसरा संदर्भ आता है।

यह documentation में समझाया गया है:

गिनती लौटे आम ​​तौर पर एक अधिक है की तुलना में आप उम्मीद कर सकते, क्योंकि यह (अस्थायी) getrefcount().

लिए एक तर्क के रूप संदर्भ शामिल हैं आपके दूसरे प्रश्न के अनुसार:

यदि मैं "डेल ए", "numpy.array ([1। 2,3.4]) "ऑब्जेक्ट अभी भी वहां है (कोई कचरा संग्रह नहीं)?

समय getrefcount() बाहर निकलता करके, सरणी के संदर्भ गिनती 1 को वापस करने के लिए होगा, और बाद में एक del a स्मृति रिलीज होगी।

+0

यदि यह "मूल्य द्वारा प्रतिलिपि बनाई गई" तो कोई दूसरा संदर्भ नहीं होगा। पायथन संदर्भ द्वारा तर्क पास करता है, और स्पष्ट रूप से पूछे जाने तक मूल्यों की प्रतिलिपि नहीं करता है। – bukzor

+0

@bukzor: यदि आप उत्तर को ध्यान से पढ़ते हैं, तो आप देखेंगे कि "मूल्य द्वारा" शब्द "संदर्भ" शब्द पर लागू होते हैं, जिसे आपने आसानी से अपने उद्धरण से छोड़ा है। ऐसा लगता है कि आपने जो कुछ कहने की कोशिश की थी उसे गलत समझा है। दुर्भाग्य से, मैं नहीं देखता कि स्पष्टता और परिशुद्धता में सुधार करने के लिए मैं जवाब कैसे दोहराता हूं; यदि आपके पास कोई विशिष्ट सुझाव है, तो मुझे बताएं। – NPE

+2

जब आप getrefcount() को कॉल करते हैं, तो उस फ़ंक्शन के स्थानीय चर दिए गए तर्क का संदर्भ देते हैं, अस्थायी रूप से ऑब्जेक्ट की संदर्भ गणना को बढ़ाते हैं। – bukzor

संबंधित मुद्दे