mirror of https://github.com/python/cpython
gh-91081: Add note on WeakKeyDictionary behavior when deleting a replaced entry (#91499)
Co-authored-by: Pieter Eendebak <P.T.eendebak@tudelft.nl> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
parent
a2bb3b7f9d
commit
c615286e85
|
@ -172,6 +172,30 @@ See :ref:`__slots__ documentation <slots>` for details.
|
|||
application without adding attributes to those objects. This can be especially
|
||||
useful with objects that override attribute accesses.
|
||||
|
||||
Note that when a key with equal value to an existing key (but not equal identity)
|
||||
is inserted into the dictionary, it replaces the value but does not replace the
|
||||
existing key. Due to this, when the reference to the original key is deleted, it
|
||||
also deletes the entry in the dictionary::
|
||||
|
||||
>>> class T(str): pass
|
||||
...
|
||||
>>> k1, k2 = T(), T()
|
||||
>>> d = weakref.WeakKeyDictionary()
|
||||
>>> d[k1] = 1 # d = {k1: 1}
|
||||
>>> d[k2] = 2 # d = {k1: 2}
|
||||
>>> del k1 # d = {}
|
||||
|
||||
A workaround would be to remove the key prior to reassignment::
|
||||
|
||||
>>> class T(str): pass
|
||||
...
|
||||
>>> k1, k2 = T(), T()
|
||||
>>> d = weakref.WeakKeyDictionary()
|
||||
>>> d[k1] = 1 # d = {k1: 1}
|
||||
>>> del d[k1]
|
||||
>>> d[k2] = 2 # d = {k2: 2}
|
||||
>>> del k1 # d = {k2: 2}
|
||||
|
||||
.. versionchanged:: 3.9
|
||||
Added support for ``|`` and ``|=`` operators, specified in :pep:`584`.
|
||||
|
||||
|
|
Loading…
Reference in New Issue