On 06/08/2020 05:17, ZHAOWANCHENG wrote:
the doc of dictionary said "if a tuple contains any mutable object either directly
or indirectly, it cannot be used as a key."
i think a instance of user-defined class is mutable, but i found it can be
placed into a tuple that as a key of a dict:
>>> class mycls(object):
... a = 1
...
>>> me = mycls()
>>> me.a = 2 # mutable?
>>> {(1, me): 'mycls'}
{(1, <__main__.mycls object at 0x0000022824DAD668>): 'mycls'}
>>>
So are instances of user-defined classes mutable or immutable?
user class instances are clearly mutable, and in my python 3.8 you can do
horrid things like this
class H:
... a = 1
... def __hash__(self):
... return hash(self.a)
...
h = H()
hash(h)
1
h.a =2
hash(h)
2
t=(1,h)
d={t:23}
d
{(1, <__main__.H object at 0x7f5bf72021f0>): 23}
hash(h)
2
hash(list(d.keys())[0])
-3550055125485641917
h.a=33
hash(list(d.keys())[0])
-3656087029879219665
so the dict itself doesn't enforce immutability of its keys
--
Robin Becker
--
https://mail.python.org/mailman/listinfo/python-list