2012-07-27 21 views
7

सी/सी ++ में, आपके पास फ़ंक्शन के अंदर स्थानीय चर बनाने पर स्टैक में चर होते हैं।पायथन ढेर से सब कुछ बनाता है?

http://effbot.org/zone/call-by-object.htm

CLU वस्तुओं प्रक्रिया सक्रियण की स्वतंत्र रूप से मौजूद हैं। ऑब्जेक्ट्स के लिए स्पेस गतिशील स्टोरेज एरिया /.../ में सिद्धांत से आवंटित किया गया है, सभी ऑब्जेक्ट हमेशा के लिए मौजूद हैं। अभ्यास में, किसी ऑब्जेक्ट द्वारा उपयोग की जाने वाली जगह को फिर से दावा किया जा सकता है जब ऑब्जेक्ट isno किसी भी CLU प्रोग्राम के लिए अधिक सुलभ है।

क्या इसका मतलब है कि पाइथन में वस्तुएं ढेर से बनाई गई हैं (जैसे सी/सी ++ में मॉलोक में)? और वस्तुओं को तब तक हटा दिया जाता है जब उनके साथ कोई नाम नहीं है? (स्मार्ट पॉइंटर्स की तरह)?

उदाहरण:

def foo(a): 
    result = [] 
    result.append(a) 
    return result 

foo("hello") 

myList = foo("bye") 

तो सबसे पहले परिणाम ([]) ढेर में बनाया गया था और इसके साथ जुड़े कोई नाम नहीं है, क्योंकि वहाँ पुनः आवंटित की जाती हो गया?

+0

यदि आपको लगता है कि आपको आवश्यकता है तो आप 'del' के रूप में 'del' का उपयोग करके मैन्युअल रूप से चीजों को हटा सकते हैं। –

+0

यदि यह पूछने के लिए आपकी प्रेरणा यह है कि आप चाहते हैं कि आपका फ़ंक्शन हमेशा एक ही सूची का उपयोग करे, तो ध्यान दें कि आप इसे 'def foo (a, result = [])' के रूप में परिभाषित कर सकते हैं, और उसी सूची का उपयोग हर बार किया जाएगा फ़ंक्शन को कॉल करें, क्योंकि यह फ़ंक्शन परिभाषित होने पर बनाया गया है, जब यह चलाया जाता है। – geoffspear

उत्तर

12

हां, सभी पायथन ऑब्जेक्ट ढेर पर रहते हैं (कम से कम सीपीथन पर।) वे संदर्भित हैं: ऑब्जेक्ट का अंतिम संदर्भ गायब होने पर उन्हें आवंटित किया जाता है। (सीपीथॉन में चक्र तोड़ने के लिए एक कचरा कलेक्टर भी है।)

सीपीथॉन में आपकी पहली सूची फ़ंक्शन लौटती है जैसे ही आप रिटर्न वैल्यू को किसी नाम पर बाध्य नहीं करते हैं और संदर्भ गणना शून्य पर गिर जाती है। अन्य कार्यान्वयन में ऑब्जेक्ट लंबे समय तक जीवित रह सकता है जब तक कचरा-कलेक्टर नहीं निकलता है।

कुछ ऑब्जेक्ट्स (खुली फ़ाइलों की तरह) में संसाधन संलग्न होते हैं जो ऑब्जेक्ट को हटाए जाने पर स्वचालित रूप से मुक्त हो जाते हैं, लेकिन उपरोक्त की वजह से इसकी अनुशंसा नहीं की जाती है इस पर भरोसा करो। जब आप उनके साथ काम करते हैं तो संसाधनों को स्पष्ट रूप से बंद किया जाना चाहिए।

5

हां, सीपीथॉन में सभी मूल्यों को ढेर पर रखा जाता है और संदर्भित किया जाता है कि उन्हें कब हटाना है। सी के विपरीत, ज्यादातर मामलों में जानने का कोई तरीका नहीं है यदि कोई मूल्य उसके कार्य को पार कर लेगा, तो केवल एकमात्र सुरक्षित चीज है कि सबकुछ ढेर करना।

निश्चित रूप से आप कुछ विश्लेषण कर सकते हैं और यह निर्धारित कर सकते हैं कि कुछ मूल्य कभी भी कार्यों में पारित नहीं होते हैं और इस तरह से बच नहीं सकते हैं, लेकिन यह पायथन में सीमित उपयोग है और अतिरिक्त ओवरहेड शायद इसके लायक नहीं होगा।

class Test(object): 
    def __init__(self, name): 
     self.name = name 

    def __del__(self): 
     print "deleting {0}".format(self.name) 

print "discarded instance creation" 
Test("hello") 

print "saved instance creation" 
myList = Test("bye") 

print "program done" 

आउटपुट::

 
discarded instance creation 
deleting hello 
saved instance creation 
program done 
deleting bye 

अधिक गहराई के लिए

4

अन्य उत्तर के लिए एक पूरक के रूप में, यहाँ ट्रैक करने के लिए जब कचरा-संग्रह होता है, विशेष विधि __del__ का उपयोग कर एक ही रास्ता है डेटा, gc module देखें।

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