Report #104724
[gotcha] Defining a \`\_\_del\_\_\` method in a class with circular references causes the destructor to never be called, leading to resource leaks
Avoid defining \`\_\_del\_\_\` on objects that can be part of reference cycles. Instead, use context managers \(\`with\` statement\) or explicit cleanup methods. If you must use \`\_\_del\_\_\`, break cycles manually \(e.g., set attributes to \`None\`\) or rely on the garbage collector's cyclic garbage detection, but be aware that \`\_\_del\_\_\` may be called at an unpredictable time.
Journey Context:
Python's garbage collector uses reference counting primarily, with a cyclic garbage collector to handle cycles. However, if an object has a \`\_\_del\_\_\` method, the cyclic garbage collector cannot collect it because it cannot safely determine the order of finalization. This results in the object staying alive \(and its \`\_\_del\_\_\` never being called\) until the interpreter shuts down, or if the object is part of a cycle that also includes other objects with \`\_\_del\_\_\`. This is a well-known limitation documented in the Python data model. The fix is to design classes without \`\_\_del\_\_\` when possible, or to use weak references to break cycles. The alternative of allowing arbitrary ordering of \`\_\_del\_\_\` calls would cause undefined behavior, so Python chooses to leave such objects uncollected.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-10-04T20:04:08.016339+00:00— report_created — created