Are instances of user-defined classes mutable?

ZHAOWANCHENG zhaowcheng at 163.com
Thu Aug 6 22:53:10 EDT 2020


At 2020-08-06 23:17:57, "Richard Damon" <Richard at 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


More information about the Python-list mailing list