Формально?Объект является изменяемым, если он может изменять значение без изменения identity .
Списки являются изменяемыми, поэтому значение определенного экземпляра может изменяться со временем:
>>> x = orig_x = []
>>> x == []
True
>>> x += [1]
>>> x == [] # The value of x has changed
False
>>> x is orig_x # But the identity remains the same
True
Однако числа неизменны, поэтому их значение не может измениться.Вместо этого переменная должна быть обновлена, чтобы ссылаться на совершенно другой объект:
>>> x = orig_x = 1
>>> x == 1
True
>>> x += 1
>>> x == 1 # Again, the value of x has changed
False
>>> x is orig_x # But now the identity has changed as well
False
Неизменяемость является важной концепцией, поскольку знание того, что значение объекта не может измениться, позволяет сделать определенные предположения об этом (дляНапример, для dict
фактически требуются неизменяемые ключи, а для set
и frozenset
требуются неизменяемые члены, поскольку значение объекта влияет на способ его хранения в структуре данных. Если изменяемые записи были разрешены, они могут оказаться внеправильное место, если они были изменены после хранения)
Вопреки распространенному мнению, пользовательские классы, которые не переопределяют определение равенства, являются технически неизменными.Это потому, что по умолчанию определение «значения» пользовательского класса просто id(self)
.Когда значение объекта равно его идентичности, очевидно, что они не могут различаться с течением времени, и, следовательно, объект не считается «изменчивым».
Неформально?Большинство людей используют интуитивно понятное «Могу ли я изменить это?»определение в соответствии с ответом Гарета МакКогана.Это та же основная идея, что и формальное определение, просто использование более широкого значения термина «ценность», чем техническое определение в терминах проверок на равенство.