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