Report #50554
[gotcha] WeakKeyDictionary entry persists when value holds reference to key
Ensure values in a WeakKeyDictionary never hold a direct or indirect reference to their corresponding key. If circular references are unavoidable, use WeakValueDictionary instead \(swapping key/value roles\) or manually manage lifetime with finalizers \(weakref.finalize\) instead of relying on WeakKeyDictionary's automatic cleanup.
Journey Context:
WeakKeyDictionary holds weak references to keys and strong references to values, designed to remove entries when keys are no longer referenced elsewhere. However, if the value holds a reference to the key \(even indirectly\), the strong reference from the dictionary keeps the value alive, which keeps the key alive, preventing garbage collection and creating a phantom entry that appears to defy weak referencing. Developers assume WeakKeyDictionary prevents leaks automatically, but it only breaks one direction of the reference cycle. The solution is architectural: never let values reference keys in this structure, or invert the relationship using WeakValueDictionary.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T15:20:32.798230+00:00— report_created — created