Автор: CoolPython
В Python объекты бывают мутабельные и иммутабельные. Значение иммутабельного объекта нельзя изменить после того, как он был создан, а значение мутабельного можно.
Рассмотрим на примере. В Python есть встроенная функция id()
. В реализации CPython она возвращает адрес, по которому объект находится в памяти. Создадим список и посмотрим, в ячейке с каким номером он окажется.
>>>beatles = [“Ringo”, “Paul”, “John”, “George”] >>>id(beatles) 140181376779336
Видим, что список лежит по адресу 140181376779336. Теперь изменим какой-нибудь элемент списка и посмотрим, изменился ли адрес.
>>>beatles[0] = “Pete” >>>beatles [“Pete”, “Paul”, “John”, “George”] >>>id(beatles) 140181376779336
Видим, что адрес списка не меняется, если мы изменяем элементы, которые в него входят. Теперь создадим в памяти строку
>>>bass = "Paul" >>>id(bass) 140068833595776
и добавим в нее что-нибудь
>>>bass += " McCartney" >>>bass Paul McCartney >>>id(bass) 140068833600432
Видим, что адрес строки изменился.
Почему так? Строка иммутабельна, то есть, после того, как она уже создана, нельзя изменить ее содержимое. Поэтому интерпретатор перезаписывает ее по новому адресу с новыми символами. А список мутабелен, поэтому его адрес не меняется оттого, что мы заменили один элемент.
Вот какие встроенные типы есть в python:
Класс Описание Мутабелен?
---------------------------------
bool булевый тип -
int целочисленный тип -
float число с плавающей запятой -
list список +
tuple кортеж -
str строка -
set множество +
dict словарь +
Количество встроенных иммутабельных типов в Python больше, но если вы захотите создать свой класс, он будет мутабельным.
Важно отличать мутабельность от иммутабельности, так как некоторые типы данных, например, dict или set, реализованы как хэш-таблицы. Когда вы добавляете элемент в множество, интерпретатор берет хэш от этого элемента и размещает значение по адресу, который совпадает с хэшем. Если мы попытаемся положить список в множество, то получим TypeError, потому что хэш бы изменился, когда изменился бы один из элементов списка:
TypeError: unhashable type: 'list'
Поэтому мутабельные объекты, такие как словари или списки, не могут быть ключами в словаре или элементами множества. А вот строки или числа могут. И это на самом деле очень естественно.