تقنية

gc.disable في بايثون: هل يمنع اختفاء الكائن؟

تعطيل الجمع واختفاء الكائن
مثال غير دوري. [1] [2] [3]

نحذف مرجعًا قويًا ونراقب مرجعًا ضعيفًا. [1] [2] [3]

الخلاصة السريعة

التعطيل لا يمنع اختفاء كائننا غير الدوري. [1] [2] [3]

  • الخرج في CPython3.12.14: False True. [1] [2] [3]
  • False: الجمع التلقائي معطل؛ True: المرجع يعيد None. [1] [2] [3]
  • weakref لا يبقي الكائن حيًا؛ لا مراجع قوية أخرى. [1] [2] [3]
  • الدورة الذاتية تختلف؛ gc.collect() يجمعها يدويًا رغم التعطيل. [1] [2] [3]
  • يعيد finally حالة التفعيل السابقة. [1] [2] [3]

المثال

import gc,weakref
class C: pass
old=gc.isenabled()
gc.disable()
try:
 obj=C();r=weakref.ref(obj)
 del obj
 print(gc.isenabled(),r() is None)
finally:
 if old: gc.enable()

[1] [2] [3]

لماذا يختفي؟

الجامع الدوري يكمل العد المرجعي في CPython؛ تعطيله لا يعطل العد. حذفنا آخر مرجع قوي لكائن بلا دورة. أما إضافة obj.link=obj قبل الحذف فتعطي False False؛ وبعد الجمع اليدوي تصبح False True. [1] [2] [3]

الدورة والجمع اليدوي
حالة مقارنة. [1] [2] [3]

الحدود

اختبار مؤلف بلا مُنهي أو رد نداء. لا نعمم توقيت الاختفاء على كل تنفيذ لبايثون، ولا نقيس ذاكرة نظام التشغيل أو سرعة البرنامج. [1] [2] [3]

المراجع

  1. Python: gc
  2. CPython3.12.14: gcmodule.c
  3. Python: weakref
  4. موضوع تك: لغة بايثون — مفردات
  5. موضوع تك: تطبيقات بايثون — مفردات

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.