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