At 2020-08-06 23:17:57, "Richard Damon" <rich...@damon-family.org> wrote:
>On 8/6/20 10:40 AM, Robin Becker wrote: >> 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 >But since the 'mutation' doesn't affect the hash or the equality tests >on the object, is it really a mutation? >> >>>>>> 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 >Yes, here you have defined a hash that violates the requirements of the >Dictionary (and most things that use hashes) so your class is broken, >and you can expect to get strangeness out of your dictionary. >> -- >> Robin Becker >> > >-- >Richard Damon > >-- >https://mail.python.org/mailman/listinfo/python-list So instances of user-defined classes are immutable by default? Or the description of "if a tuple contains any mutable object either directly or indirectly, it cannot be used as a key." in the document is not completely correct? The description mentioned above comes from here: https://docs.python.org/3/tutorial/datastructures.html#dictionaries -- https://mail.python.org/mailman/listinfo/python-list