পাইথন অযন্ত্রণীয় অবজেক্টগুলো (বিল্ট-ইন টাইপ বা ক্লাস ইনস্ট্যান্স) অটোমেটিক্যালি ডিলিট করে মেমরি স্পেস ফ্রি করতে। পাইথন পিরিয়ডিক্যালি মেমরি ব্লকগুলো ফ্রি ও রিক্লেইম করে যেগুলো আর ব্যবহৃত হয় না, এই প্রসেসকে গার্বেজ কালেকশন বলা হয়।
পাইথনের গার্বেজ কালেক্টর প্রোগ্রাম এক্সিকিউশন aikana চলে এবং ট্রিগার হয় যখন একটি অবজেক্টের রেফারেন্স কাউন্ট শূন্য হয়। একটি অবজেক্টের রেফারেন্স কাউন্ট পরিবর্তিত হয় আলিয়াসের সংখ্যা পরিবর্তন হলে যেগুলো সেটিকে পয়েন্ট করে।
একটি অবজেক্টের রেফারেন্স কাউন্ট বৃদ্ধি পায় যখন সেটিকে একটি নতুন নাম অ্যাসাইন করা হয় বা একটি কন্টেইনারে (লিস্ট, টাপল, বা ডিকশনারি) রাখা হয়। অবজেক্টের রেফারেন্স কাউন্ট কমে যখন সেটি del- দিয়ে ডিলিট করা হয়, এর রেফারেন্স রি-অ্যাসাইন করা হয়, বা এর রেফারেন্স স্কোপ থেকে বাইরে চলে যায়। যখন একটি অবজেক্টের রেফারেন্স কাউন্ট শূন্য হয়, পাইথন সেটিকে অটোমেটিক্যালি কালেক্ট করে।
a = 40 # Create object <40> b = a # Increase ref. count of <40> c = [b] # Increase ref. count of <40> del a # Decrease ref. count of <40> b = 100 # Decrease ref. count of <40> c[0] = -1 # Decrease ref. count of <40>
সামান্যরূপে আপনি গার্বেজ কালেক্টর অনাথ ইনস্ট্যান্স ডিস্ট্রয় করলে নোটিস করবেন না। কিন্তু একটি ক্লাস স্পেশাল মেথড __del__() ইমপ্লিমেন্ট করতে পারে, যাকে ডিস্ট্রাক্টর বলা হয়, যা ইনভোক হয় যখন ইনস্ট্যান্স ডিস্ট্রয় হওয়ার integrally। এই মেথডটি নন-মেমরি রিসোর্স ক্লিনআপ করতে ব্যবহৃত হতে পারে যা একটি ইনস্ট্যান্স ব্যবহার করছিল।
উদাহরণ
এই __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) # prints the ids of the obejcts
del pt1
del pt2
del pt3
আউটপুট
উপরের কোড এক্সিকিউট করালে নিচের রেজাল্ট আসবে -
3083401324 3083401324 3083401324 Point destroyed