Найти в Дзене
Машинное обучение

Python. Чем мутабельные объекты отличаются от иммутабельных?

В 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 объекты бывают мутабельные и иммутабельные. Значние иммутабельного объектра нельзя изменить после того, как он был создан, а значение мутабельного можно.

Рассмотрим на примере. В 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'

Поэтому мутабельные объекты, такие как словари или списки, не могут быть ключами в словаре или элементами множества. А вот строки или числа .

#python

#перед_собесом #основы #типы_данных #мутабельность #иммутабельностьЧем

#типы_данных #мутабельность #иммутабельность

Python RU