Изменяемые и неизменяемые типы данных в Python

Автор: admin

Дата: 12.09.2020 08:47

Задумывались ли вы, почему в Python есть изменяемые и неизменяемые типы?

Вы когда-нибудь сталкивались с подобной ошибкой в Python?

>>> s = 'hello'
>>> s[0] = 'H'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

В этой статье я приведу несколько практических примеров и покажу некоторые преимущества использования неизменяемых типов.

Типы

Согласно справочнику по языку Python, раздел Модель данных:

Значение некоторых объектов может измениться. Объекты, чье значение может измениться, называются изменяемыми; объекты, значение которых неизменяемо после их создания, называются неизменяемыми. Изменчивость объекта определяется его типом; например, числа, строки и кортежи неизменны, а словари и списки изменчивы.

Давайте посмотрим на некоторые примеры

Создание строки String

Когда я начал изучать Python, меня не слишком волновало как происходит конкатенации строк. Я часто использовал длинные цепочки строительного кода типа такого:

>>> s = 'hello'
>>> s += 'world'
>>> s += ...

Однако, если мы посмотрим на id каждой строки во время создание всего предложения мы увидем:

>>> s = 'hello'
>>> id(s)
4341555696
>>> s += 'world'
>>> id(s)
4341545584  => new object created!

Видно на каждом этапе создание предложения создается новая строка. Что может быть иногда не эффективно с точки зрения производительности. Возможно в подобной ситуации предпочтительно использовать изменяемый тип (например список):

>>> l = ['hello']
>>> id(l)
4341463496
>>> l.append('world')
>>> id(l)
4341463496  => same object

Использование списков в данной ситуации будет обходится дешевле с точки зрения производительности, потому что вы можете изменить размер объекта на лету.

С другой стороны, размер неизменяемых типов заранее известен в памяти, что делает их более быстрыми во время доступа к ним (Более подробное можно почитать тут: Кортежи имеют тенденцию работать лучше, чем списки — Tuples tend to perform better than lists).