Добавить в корзинуПозвонить
Найти в Дзене
Креативный дизайн

Изменение объектов в Python: Внутренний мир ссылок и идентификаторов

Python — это язык, в котором всё является объектом, включая простые типы данных, такие как целые числа, строки и логические значения. Это ключевой аспект, который необходимо понимать программистам, чтобы эффективно работать с памятью и изменять объекты. В этой статье мы разберём понятие ссылок, неизменяемые и изменяемые объекты, и то, как с ними работать. В Python каждая переменная — это ссылка на объект в памяти. Получить уникальный адрес объекта можно, воспользовавшись встроенной функцией id(). Например: x = 100
print(id(x)) В этом коде переменная x содержит ссылку на объект, представляющий число 100. Когда мы вызываем id(x), то получаем уникальный идентификатор в памяти для данного объекта. Переменная содержит ссылку на объект и с помощью встроенной функции id можно узнать адрес объекта в памяти. Разные переменные могут ссылаться на один и тот же объект в памяти. Переменные при этом содержат одну и ту же ссылку, на один и тот же id, и они указывают на один и тот же объект в памяти.
Оглавление

Python — это язык, в котором всё является объектом, включая простые типы данных, такие как целые числа, строки и логические значения. Это ключевой аспект, который необходимо понимать программистам, чтобы эффективно работать с памятью и изменять объекты. В этой статье мы разберём понятие ссылок, неизменяемые и изменяемые объекты, и то, как с ними работать.

Понимание ссылок и идентификаторов

В Python каждая переменная — это ссылка на объект в памяти. Получить уникальный адрес объекта можно, воспользовавшись встроенной функцией id(). Например:

x = 100
print(id(x))

В этом коде переменная x содержит ссылку на объект, представляющий число 100. Когда мы вызываем id(x), то получаем уникальный идентификатор в памяти для данного объекта.

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

Одинаковые ссылки

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

a = [1, 2, 3]
b = a
b.append(4)

print(a)
# [1, 2, 3, 4]
print(b)
# [1, 2, 3, 4]

В этом примере a и b указывают на один и тот же список. Изменение через b отражается также и через переменную a, потому что обе переменные указывают на один и тот же объект в памяти.

Неизменяемые объекты и их адреса

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

x = 42
y = 42

print(id(x))
# Допустим, 139510671248336
print(id(y))
# Будет та же самая — 139510671248336

Поскольку 42 - это неизменяемый объект, и это значение уже существует, x и y ссылаются на один и тот же объект в памяти, что демонстрируется идентичными id.

В случае использования неизменяемых объектов, Python создаёт объект только один раз в памяти. И если такой объект уже был ранее создан и мы создаём другую переменную и присваиваем ей то же самое значение, то Python найдёт уже ранее созданный объект в памяти и этой переменной просто даст ссылку на этот объект в памяти, который там уже существует и был создан ранее.

Неизменяемые объекты можно копировать. Для неизменяемых объектов в случае произведения на копии каких либо операций, создаётся новый объект, не изменяя существующий. Поэтому после копирования и произведения какой-либо операции, например, прибавления к переменной значений, родительский объект после такой операции не изменяется. И создаётся второй объект в памяти, с ссылкой на новый объект после произведения каких либо манипуляций с родительским объектом.

Объекты не изменяются, а создаются новые значения и новые объекты, и новое значение присваивается переменной.

Изменения и копирование объектов

При попытке изменения неизменяемого объекта создаётся новый объект:

s1 = "hello"
s2 = s1

s1 = s1 + " world"

print(s1)
# hello world
print(s2)
# hello

Поскольку строки неизменяемы, то при выполнении операции сложения, Python создаёт новый объект для s1, в то время как s2 продолжает ссылаться на первоначальный объект.

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

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

list1 = [1, 2, 3]
list2 = list1.copy()

list2.append(4)

print(list1)
# [1, 2, 3]
print(list2)
# [1, 2, 3, 4]

С помощью .copy(), мы создаем новый объект в памяти для list2, и изменения в list2 не касаются list1.

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

Рекомендации по усовершенствованию кода

  1. Будьте осведомлены, какие переменные ссылаются на один и тот же объект, чтобы избежать неожиданных изменений. Используйте модуль copy, если необходимо глубоко скопировать сложные структуры данных.
  2. Предпочитайте изменяемые объекты, если требуется часто изменять значения, чтобы избежать создания лишних объектов в памяти, тем самым улучшая производительность программы.
  3. Используйте неизменяемые объекты, если данные должны оставаться постоянными после создания. Это повышает надёжность вашего кода.

Заключение

Понимание фундаментальных концепций 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

---------------------------------------

Донат для автора блога

dzen.ru/grafantonkozlov?donate=true