Изменяемые и неизменяемые объекты в Python — примеры
В этом уроке вы узнаете об изменяемых и неизменяемых типах данных и объектах в Python.
- Что такое изменяемые и неизменяемые объекты в Python?
- Пример неизменяемого объекта в Python
- Пример изменяемого объекта в Python
- Пример с изменяемым и неизменяемым объектами в Python
Что такое изменяемые и неизменяемые объекты в Python?
В Python все является объектом. Объект имеет свое внутреннее состояние. Некоторые объекты позволяют вам изменять свое внутреннее состояние, а другие — нет.
Объект, внутреннее состояние которого можно изменить, называется изменяемым объектом, а объект, внутреннее состояние которого невозможно изменить, называется неизменяемым объектом.
Ниже приведены примеры неизменяемых объектов:
- Числа (int, float, bool,…)
- Строки
- Кортежи
- Frozen sets
Ниже приведены примеры изменяемых объектов:
- Списки
- Множества
- Словари
Пользовательские классы могут быть изменяемыми или неизменяемыми, в зависимости от того, можно ли изменить их внутреннее состояние или нет.
Пример неизменяемого объекта в Python
Когда вы объявляете переменную и присваиваете ей целое число, Python создает новый целочисленный объект и устанавливает переменную для ссылки на этот объект:
counter = 100
Чтобы получить адрес памяти, на который ссылается переменная, вы используете функцию id(). Функция id() возвращает число, основанное на 10:
print(id(counter))
Выход:
140717671523072
А чтобы преобразовать число по основанию 10 в шестнадцатеричное, вы можете использовать функцию hex():
print(hex(id(100)))
Выход:
0x7ffb62d32300
В памяти есть переменная counter, которая ссылается на целочисленный объект, расположенный по адресу 0x7ffb62d32300:
Следующее изменяет counter на 200 и отображает его значение на экране:
counter = 200 print(counter)
Выход:
200
Кажется, что значение объекта, на который ссылается переменная counter, меняется, но это не так.
Фактически, Python создает новый целочисленный объект со значением 200 и переназначает переменную counter так, чтобы она ссылалась на новый объект следующим образом:
Переназначение не меняет значение первого целочисленного объекта. Он просто переназначает ссылку.
Ниже показан адрес памяти нового объекта, на который ссылается переменная counter:
counter = 200 print(counter) print(hex(id(counter)))
Выход:
0x7ffb62d32f80
Пример изменяемого объекта в Python
Следующий код определяет список чисел и отображает адрес памяти списка:
ratings = [1, 2, 3] print(hex(id(ratings))) # 0x1840f97a340
Python создает новый объект списка и устанавливает переменную Ranks для ссылки на список:
Когда вы добавляете номер в список следующим образом:
ratings.append(4)
Python напрямую меняет значение объекта списка:
И Python не создает новый объект, как в предыдущем неизменяемом примере.
Следующий код показывает значение и адрес памяти списка, на который ссылается переменная ratings:
print(ratings) # [1, 2, 3, 4] print(hex(id(ratings))) # 0x1840f97a340
Как вы можете ясно видеть из вывода, адрес памяти списка тот же.
Пример с изменяемым и неизменяемым объектами в Python
Важно понимать, что неизменяемые объекты — это не что-то замороженное или абсолютно постоянное. Давайте посмотрим на пример.
Следующий код определяет кортеж, элементами которого являются два списка:
low = [1, 2, 3] high = [4, 5] rankings =(low, high)
Поскольку rankings представляет собой кортеж, он неизменен. Таким образом, вы не можете добавить к нему новый элемент или удалить из него элемент.
Однако кортеж rankings содержит два списка, которые являются изменяемыми объектами. Таким образом, вы можете без проблем добавить новый элемент в верхний список:
high.append(6) print(rankings)
И кортеж rankings изменится на следующее:
([1, 2, 3], [4, 5, 6])