هر شیء تا وقتی زنده است که دستکم یک ارجاع به آن برسد. در CPython شمارندهٔ ارجاع با صفرشدن فوراً آزاد میکند — اما این رفتارِ پیادهسازی است، نه قولِ زبان (در PyPy زمانبندی فرق میکند).
a = [1, 2, 3]
b = a # شمارنده: ۲
del a # شمارنده: ۱ — هنوز زنده چون b هست
b = None # شمارنده: ۰ — در CPython همینجا آزاد میشود
چرخه (A به B ارجاع دهد و B به A) را شمارنده بهتنهایی جمع نمیکند؛ زبالهروبِ چرخهایِ پایتون دورهای آنها را مییابد. نتیجهٔ عملی: (۱) به __del__ برای کارِ مهم اعتماد نکن، (۲) منبعها (فایل، قفل، اتصال) را با with مدیریت کن، (۳) برای کشِ بدون جلوگیری از مرگ شیء از weakref استفاده کن.
اشتباه رایج
وقتی متغیر از اسکوپ خارج شد، __del__ حتماً و فوراً اجراست.
تصحیح
در چرخهها و پیادهسازیهای غیر CPython تضمینی نیست. __del__ فقط برای نظافتِ غیرحساس است.