2014-04-13 7 views
6
In [1]: class T(object): 
    ...:  pass 
    ...: 

In [2]: x = T() 

In [3]: print(x) 
<__main__.T object at 0x03328E10> 

In [4]: x = T() 

In [5]: print(x) 
<__main__.T object at 0x03345090> 

पहली T() ऑब्जेक्ट (0x03328E10) को आवंटित स्मृति स्थान कब मुक्त किया गया है? क्या यह है जब परिवर्तनीय x ओवरराइट किया गया है या जब कचरा कलेक्टर चलाया जाता है या जब स्क्रिप्ट समाप्त होती है?जब आप चर को ओवरराइट करते हैं तो पाइथन में मेमोरी स्थानों का क्या होता है?

मैं इसे संभालने हूँ जब कचरा कलेक्टर रन लेकिन मैं कैसे कि इस धारणा का परीक्षण करने नहीं जानता है।

+0

https://docs.python.org/2/library/gc.html – Alex

उत्तर

3

पायथन स्मृति प्रबंधन संदर्भ गिनती के माध्यम से किया जाता है, न कि कचरा संग्रहण की तुलना में। जब संदर्भ गणना शून्य पर जाती है, तो स्मृति पुनर्विक्रय के लिए उपलब्ध होती है।

कचरा कलेक्टर केवल तब खेलता है जब आपके परिपत्र संदर्भ होते हैं, जो यहां नहीं है।

1

सबसे पहले, यह क्या अजगर कार्यान्वयन प्रयोग कर रहे हैं पर निर्भर करता है। सीपीथॉन, संदर्भ कार्यान्वयन, संदर्भ गिनती करता है, इसका मतलब है कि आपकी धारणा सही है। आप __del__ विधि को लागू करके उस धारणा का परीक्षण कर सकते हैं।

हालांकि यह एक बुरा व्यवहार से बचने के लिए है। उदाहरण के लिए, पीपीपी, आयरनपीथन, और जेथन इसके बजाय कचरा संग्रह करते हैं, इसलिए आपकी धारणा की गारंटी नहीं है।

तो संसाधन कर सकते हैं अंतिम रूप दिए जाने अजगर में लागू किया? इसके बजाय context managers का उपयोग करें। संदर्भ प्रबंधकों RAII सुविधा पायथन प्रदान करता है। अधिकांश भाग के लिए

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

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