رفتن به محتوای اصلی
برنامه‌سازی پیشرفته با پایتون درس‌نامهٔ آزاد
مفهوم متوسط ۸ دقیقه

چرخهٔ عمر شیء و زباله‌روبی

شمارش ارجاع، چرخهٔ ارجاعی، __del__ غیرقابل‌اعتماد و الگوی درست مدیریت منبع.

هر شیء تا وقتی زنده است که دست‌کم یک ارجاع به آن برسد. در CPython شمارندهٔ ارجاع با صفرشدن فوراً آزاد می‌کند — اما این رفتارِ پیاده‌سازی است، نه قولِ زبان (در PyPy زمان‌بندی فرق می‌کند).

a = [1, 2, 3]
b = a        # شمارنده: ۲
del a        # شمارنده: ۱ — هنوز زنده چون b هست
b = None     # شمارنده: ۰ — در CPython همین‌جا آزاد می‌شود

چرخه (A به B ارجاع دهد و B به A) را شمارنده به‌تنهایی جمع نمی‌کند؛ زباله‌روبِ چرخه‌ایِ پایتون دوره‌ای آن‌ها را می‌یابد. نتیجهٔ عملی: (۱) به __del__ برای کارِ مهم اعتماد نکن، (۲) منبع‌ها (فایل، قفل، اتصال) را با with مدیریت کن، (۳) برای کشِ بدون جلوگیری از مرگ شیء از weakref استفاده کن.

برداشت نادرست رایج

اشتباه رایج

وقتی متغیر از اسکوپ خارج شد، __del__ حتماً و فوراً اجراست.

تصحیح

در چرخه‌ها و پیاده‌سازی‌های غیر CPython تضمینی نیست. __del__ فقط برای نظافتِ غیرحساس است.

مطالب مرتبط

از همین بخش و با برچسب‌های مشترک

این مطلب را خواندید؟ آن را علامت بزنید تا پیشرفت شما روی همین دستگاه ذخیره شود.

وضعیت پیشرفت برای چرخهٔ عمر شیء و زباله‌روبی