Изменяемые и неизменяемые объекты в Python

Изменяемые и неизменяемые объекты в Python

Эта статья объясняет изменяемые и неизменяемые объекты в Python.

YouTube Video

Изменяемые и неизменяемые объекты в Python

«Изменяемый» и «неизменяемый» относятся к изменяемости объекта. Понимание этого поможет избегать неожиданных ошибок и эффективно управлять памятью.

Что такое изменяемый объект?

Изменяемые объекты могут изменять свое внутреннее состояние после создания.

Основные типы данных, являющиеся изменяемыми

  • list
  • dict
  • set
  • Пользовательские классы (если их атрибуты могут быть изменены)

Пример: Изменение списка

1numbers = [1, 2, 3]
2numbers[0] = 100
3print(numbers)  # [100, 2, 3]

Список — это изменяемый объект, и его элементы можно свободно изменять.

Что такое неизменяемый объект?

Неизменяемые объекты не могут быть изменены после создания. Попытка изменить их приводит к созданию нового объекта.

Основные типы данных, являющиеся неизменяемыми

  • int
  • float
  • str
  • tuple
  • bool
  • frozenset

Пример: Изменение строки

1text = "hello"
2# text[0] = "H"  # TypeError: 'str' object does not support item assignment
3
4text = "H" + text[1:]  # Creates a new string
5print(text)  # "Hello"

Строки являются неизменяемыми, поэтому вы не можете изменить их частично.

Сравнение изменяемых и неизменяемых объектов

 1# Mutable example
 2a = [1, 2, 3]
 3b = a
 4b[0] = 100
 5print(a)  # [100, 2, 3] -> a is also changed
 6
 7# Immutable example
 8x = 10
 9y = x
10y = 20
11print(x)  # 10 -> x is unchanged

Как показано в примере выше, изменяемые объекты передаются по ссылке, поэтому они могут влиять на другие переменные. С другой стороны, неизменяемые объекты создают новые экземпляры при повторном присвоении, оставляя исходное значение неизменным.

Исследование внутреннего поведения с использованием id()

В Python вы можете использовать функцию id() для проверки идентификатора объекта. Идентификатор объекта аналогичен адресу в памяти.

 1# Immutable int behavior
 2a = 10
 3print(id(a))  # e.g., 140715920176592
 4a += 1
 5print(id(a))  # e.g., 140715920176624 -> ID has changed
 6
 7# Mutable list behavior
 8b = [1, 2, 3]
 9print(id(b))  # e.g., 2819127951552
10b.append(4)
11print(id(b))  # Same ID -> only the content has changed

Как показано, для неизменяемых типов создается новый объект, тогда как изменяемые типы изменяются на месте.

Функции и осторожность при работе с изменяемыми и неизменяемыми объектами

При передаче изменяемого объекта в функцию, исходные данные могут быть изменены.

Пример: Функция, изменяющая список

1def modify_list(lst):
2    lst.append(100)
3
4my_list = [1, 2, 3]
5modify_list(my_list)
6print(my_list)  # [1, 2, 3, 100]

Пример: Функция, изменяющая число

С другой стороны, попытка изменить неизменяемый объект приводит к созданию нового объекта.

1def modify_number(n):
2    n += 10
3
4my_number = 5
5modify_number(my_number)
6print(my_number)  # 5 -> unchanged

Практические соображения

Избегайте использования изменяемых объектов в качестве аргументов по умолчанию

 1# Bad example
 2def add_item(item, container=[]):
 3    container.append(item)
 4    return container
 5
 6print(add_item(1))  # [1]
 7print(add_item(2))  # [1, 2] -> unintended behavior
 8
 9# Good example
10def add_item(item, container=None):
11    if container is None:
12        container = []
13    container.append(item)
14    return container

Поскольку аргументы по умолчанию оцениваются только один раз при определении функции, использование изменяемых объектов может привести к непредвиденным последствиям.

Резюме

Для глубокого понимания переменных и типов данных в Python важно понять различия между изменяемыми и неизменяемыми объектами. Понимание этих характеристик помогает избежать непреднамеренного поведения в коде и писать более надежные и читаемые программы.

Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.

YouTube Video