2010-02-03 13 views
12

पायथन में स्पष्ट del कथन का उपयोग करने के लिए सर्वोत्तम प्रथाओं और सिफारिशें क्या हैं? मैं समझता हूँ कि यह गुण या शब्दकोश/सूची तत्वों और इतने पर दूर करने के लिए प्रयोग किया जाता है, लेकिन कभी कभी मैं इस तरह कोड में यह स्थानीय चर पर इस्तेमाल देखें:स्थानीय चर पर पाइथन में स्पष्ट डेल का उपयोग

def action(x): 
    result = None 
    something = produce_something(x) 
    if something: 
     qux = foo(something) 
     result = bar(qux, something) 
     del qux 
    del something 
    return result 

वहाँ इस तरह कोड लिखने के लिए किसी भी गंभीर कारणों हैं?

संपादित करें: और something पर विचार करें __del__ विधि के बिना कुछ "सरल" होना।

उत्तर

29

मुझे याद नहीं है जब मैंने पिछली बार del का उपयोग किया था - इसकी आवश्यकता वास्तव में दुर्लभ है, और आमतौर पर आवश्यक import या इसके बाद के बाद मॉड्यूल के नामस्थान को साफ करने के लिए इस तरह के कार्यों तक ही सीमित है।

विशेष रूप से, यह नहीं सच के रूप में एक और (अब हटाए) जवाब का दावा किया है,, कि

del का उपयोग करना सुनिश्चित करें एक वस्तु की __del__ विधि कहा जाता है बनाने के लिए एक ही रास्ता है

और इसे समझना बहुत महत्वपूर्ण है। मदद के लिए, आइए __del__ के साथ एक वर्ग बनाने के लिए और जाँच जब यह कहा जाता है करते हैं:

>>> class visdel(object): 
... def __del__(self): print 'del', id(self) 
... 
>>> d = visdel() 
>>> a = list() 
>>> a.append(d) 
>>> del d 
>>> 

देखते हैं? del "सुनिश्चित करें" नहीं है कि __del__ कहलाता है: del एक संदर्भ हटा देता है, और केवल को हटाने के लिए संदर्भ __del__ कहा जाता है। तो, भी:

>>> a.append(visdel()) 
>>> a[:]=[1, 2, 3] 
del 550864 
del 551184 

जब पिछले संदर्भ दूर, (तरीके, इस तरह इस मामले में के रूप में एक टुकड़ा काम, या नाम के अन्य rebindings और अन्य स्लॉट के रूप में है कि del शामिल नहीं है में भी शामिल है) हो जाता है तो__del__ कहलाता है - चाहे del ऑब्जेक्ट के संदर्भ को कम करने में कभी शामिल था, या नहीं, बिल्कुल कोई फर्क नहीं पड़ता।

तो, जब तक कि आपको विशेष रूप से किसी विशिष्ट कारण के लिए नामस्थान (आमतौर पर एक मॉड्यूल का नामस्थान, लेकिन अनुमानित रूप से किसी वर्ग या उदाहरण के) को साफ करने की आवश्यकता न हो, del से परेशान न हों (यह कभी-कभी किसी को हटाने के लिए आसान हो सकता है एक कंटेनर से आइटम, लेकिन मुझे पता चला है कि मैं अक्सर के लिए कंटेनर pop विधि या आइटम या टुकड़ा असाइनमेंट का उपयोग कर रहा हूं!)।

+0

एलेक्स, बहुत जल्द पाइथन के तकनीकी लेखकों को नौकरी के बिना होने जा रहे हैं;) एक और महान जवाब के लिए धन्यवाद। –

+0

उत्कृष्ट जवाब, +1! – jhwist

+0

@ दाना, निश्चित आशा नहीं है, क्योंकि मैं खुद ऐसे लेखक हूं ;-)। @ jhwist, धन्यवाद! –

4

सं

मुझे यकीन है कि कोई है, उदा यह करने के लिए कुछ मूर्खतापूर्ण कारण के साथ आ जाएगा यह सुनिश्चित करने के लिए कि कोई वैध रूप से वैरिएबल रूप से वैरिएबल का उपयोग नहीं करता है। लेकिन शायद जो भी इस कोड को लिखा वह उलझन में था। आप उन्हें हटा सकते हैं।

+0

+1: 'del' कथन केवल जादूगरों के लिए है। मेरी सलाह वही है: जब तक आपको कोई समस्या न हो जो वास्तव में किसी ऑब्जेक्ट को हटाकर हल हो जाती है, तो इस पर समय बर्बाद न करें। –

1

आप प्रोग्राम (मेरे अनुभव करने के लिए जब कार्यक्रम का योग स्मृति खपत 1GB की तरह कुछ दृष्टिकोण) डेटा की वास्तव में बड़ी मात्रा में निपटने चल रहे हैं जब कुछ वस्तुओं को हटाने: डेल largeObject1 डेल largeObject2 ... अपने कार्यक्रम दे सकते हैं स्मृति से बाहर किए बिना काम करने के लिए आवश्यक श्वास कक्ष। "मेमोरी एरर" रनटाइम त्रुटि के मामले में, किसी दिए गए प्रोग्राम को संशोधित करने का यह सबसे आसान तरीका हो सकता है।

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