पायथन अनावश्यक ऑब्जेक्ट्स (बिल्ट-इन टाइप्स या क्लास इंस्टेंसेस) को स्वचालित रूप से डिलीट करके मेमोरी स्पेस खाली करता है। वह प्रक्रिया जिसके द्वारा पायथन समय-समय पर उन मेमोरी ब्लॉक्स को पुनः प्राप्त करता है जो अब उपयोग में नहीं हैं, उसे गार्बेज कलेक्शन कहा जाता है।
पायथन का गार्बेज कलेक्टर प्रोग्राम निष्पादन के दौरान चलता है और तब ट्रिगर होता है जब किसी ऑब्जेक्ट का रेफरेंस काउंट शून्य तक पहुंच जाता है। किसी ऑब्जेक्ट का रेफरेंस काउंट उन एलियास की संख्या के रूप में बदलता है जो उस पर इंगित करते हैं।
जब किसी ऑब्जेक्ट को एक नया नाम दिया जाता है या किसी कंटेनर (लिस्ट, टुपल, या डिक्शनरी) में रखा जाता है, तो उसका रेफरेंस काउंट बढ़ जाता है। जब इसे del से डिलीट किया जाता है, इसका रेफरेंस पुनः असाइन किया जाता है, या इसका रेफरेंस स्कोप से बाहर चला जाता है, तो ऑब्जेक्ट का रेफरेंस काउंट घट जाता है। जब किसी ऑब्जेक्ट का रेफरेंस काउंट शून्य तक पहुंच जाता है, तो पायथन उसे स्वचालित रूप से कलेक्ट करता है।
a = 40 # ऑब्जेक्ट <40> बनाएं b = a # <40> का रेफरेंस काउंट बढ़ाएं c = [b] # <40> का रेफरेंस काउंट बढ़ाएं del a # <40> का रेफरेंस काउंट घटाएं b = 100 # <40> का रेफरेंस काउंट घटाएं c[0] = -1 # <40> का रेफरेंस काउंट घटाएं
आप आमतौर पर ध्यान नहीं देंगे जब गार्बेज कलेक्टर एक अनाथ इंस्टेंस को नष्ट करता है और उसका स्पेस पुनः प्राप्त करता है। लेकिन एक क्लास स्पेशल मेथड __del__() को लागू कर सकती है, जिसे डिस्ट्रक्टर कहा जाता है, जो तब आह्वान किया जाता है जब इंस्टेंस नष्ट होने वाला होता है। इस मेथड का उपयोग किसी इंस्टेंस द्वारा उपयोग किए जाने वाले नॉन-मेमोरी रिसोर्सेज को साफ करने के लिए किया जा सकता है।
उदाहरण
यह __del__() डिस्ट्रक्टर उस इंस्टेंस का क्लास नाम प्रिंट करता है जो नष्ट होने वाला है:
#!/usr/bin/python
class Point:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print class_name, "destroyed"
pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # ऑब्जेक्ट्स के ids प्रिंट करता है
del pt1
del pt2
del pt3
आउटपुट
जब उपरोक्त कोड निष्पादित होता है, तो यह निम्नलिखित परिणाम देता है:
3083401324 3083401324 3083401324 Point destroyed
नोट - आदर्श रूप से, आपको अपनी क्लासेस को अलग फाइल में परिभाषित करना चाहिए, फिर इम्पोर्ट स्टेटमेंट का उपयोग करके उन्हें अपने मुख्य प्रोग्राम फाइल में इम्पोर्ट करना चाहिए।