Python — язык, который привлекает своей простотой и философией. Однако, как и любой язык программирования, он имеет свои особенности, одна из которых — разделение объектов на изменяемые и неизменяемые. В этой статье мы рассмотрим поведение изменяемых объектов на примере списков и словарей, чтобы глубже понять, как это может повлиять на ваш код и как избежать возможных ловушек.
Списки как изменяемые объекты
Списки в Python — это один из самых распространённых типов изменяемых объектов. Изменяемость означает, что вы можете модифицировать существующий список, не создавая его копию.
Пример:
list_a = [1, 2, 3]
list_b = list_a # list_b ссылается на тот же объект, что и list_a
list_b.append(4) # Добавляем 4 в список
print(list_a) # Выведет: [1, 2, 3, 4]
print(list_b) # Выведет: [1, 2, 3, 4]
- list_a = [1, 2, 3]: создаётся новый список [1, 2, 3], и list_a ссылается на этот объект.
- list_b = list_a: теперь list_b ссылается на тот же объект, что и list_a.
- list_b.append(4): метод append изменяет существующий список, добавляя в него 4.
- print(list_a): выводит [1, 2, 3, 4], подтверждая, что list_a был изменён.
- print(list_b): выводит [1, 2, 3, 4], что отражает факт, что оба имени ссылаются на один и тот же объект.
Рекомендация по улучшению кода
Если требуется избежать изменения исходного списка, используйте методы копирования:
list_b = list_a.copy()
list_b.append(4)
Таким образом, list_a останется в своей исходной форме.
Списки — это изменяемые объекты в Python. И каждый из этих списков можно изменять независимо от других. В случае изменяемых объектов нет необходимости создавать несколько копий одного и того же объекта.
Каждый объект может быть изменён независимо, даже если изначально значения одинаковы. И в результате создаются разные объекты. И адреса этих объектов разные, то есть имеют разный id.
Словари как изменяемые объекты
Словари, представляющие собой наборы пар ключ-значение, тоже изменяемы. Мы можем добавлять новые пары, изменять существующие и удалять их.
Пример:
dict_a = {'key1': 'value1'}
dict_b = dict_a # dict_b ссылается на тот же объект, что и dict_a
dict_b['key2'] = 'value2' # Добавляем новый ключ-значение
print(dict_a) # Выведет: {'key1': 'value1', 'key2': 'value2'}
print(dict_b) # Выведет: {'key1': 'value1', 'key2': 'value2'}
- dict_a = {'key1': 'value1'}: создаётся новый словарь, и dict_a ссылается на него.
- dict_b = dict_a: теперь dict_b ссылается на тот же объект, что и dict_a.
- dict_b['key2'] = 'value2': добавляется новая пара ключ-значение в словарь.
- print(dict_a): выводит {'key1': 'value1', 'key2': 'value2'}, показывая, что dict_a был изменён.
- print(dict_b): выводит {'key1': 'value1', 'key2': 'value2'}, подтверждая, что это один и тот же объект.
Рекомендация по улучшению кода
Для создания независимой копии словаря используйте метод .copy():
dict_b = dict_a.copy()
dict_b['key2'] = 'value2'
Тем самым, dict_a сохранит свое изначальное состояние.
Словари — это изменяемые объекты в Python. Словари состоят из ключей и значений. Мы можем добавлять новые ключи, а так же удалять существующие. Переменные содержат ссылки на словарь (dir). Ключи в памяти компьютера создают отдельные объекты.
При создании копии объекта переменной, копируется только ссылка переменной. И в таком случае переменные будут ссылаться на один и тот же объект в памяти. То есть, переменные будут ссылаться на объект, который содержит словарь.
И при добавлении нового ключа в существующий словарь Python переходит по ссылке и изменяет существующий уже объект, добавляя новый ключ со значением. В результате изменяется только один объект на который ссылаются обе переменные. И эти изменения отразятся на обе переменные.
После копирования изменяемых объектов, изменения отражаются на всех копиях. То есть, если у нас есть один объект, который является изменяемым (в данном случае это словарь), и на него ссылается несколько переменных, то меняя этот объект через любую из этих переменных, мы получаем результат изменения всех переменных, которые ссылаются на этот объект в памяти.
Заключение
Изменяемость — мощный инструмент Python, но, если её неправильно понимать, она может привести к нежелательным последствиям в вашем коде. Как списки, так и словари предоставляют гибкость, позволяя изменять их на месте без создания новых объектов. Однако это же свойство может быть источником ошибок, если не учитывать, что переменные ссылаются на один и тот же объект. Ключевой момент при работе с изменяемыми объектами — понимание их поведения и грамотное использование возможностей копирования для защиты исходных данных.
Знание того, как ведут себя изменяемые объекты, позволяют сознательно принимать решения в коде. Выберите в своей практике подходящие методы, чтобы сделать ваш код более надежным и предсказуемым.
Полезные ресурсы:
Сообщество дизайнеров в VK
https://vk.com/grafantonkozlov
Телеграмм канал сообщества
https://t.me/grafantonkozlov
Архив эксклюзивного контента
https://boosty.to/antonkzv
Канал на Дзен
https://dzen.ru/grafantonkozlov
---------------------------------------
Бесплатный Хостинг и доменное имя
https://tilda.cc/?r=4159746
Мощная и надежная нейронная сеть Gerwin AI
https://t.me/GerwinPromoBot?start=referrer_3CKSERJX
GPTs — плагины и ассистенты для ChatGPT на русском языке
https://gptunnel.ru/?ref=Anton
---------------------------------------
Донат для автора блога