Приготовьтесь взорвать свой мозг… потому что после этой истории ваше представление о том, как работают объекты в Python, резко изменится, станет шире и богаче. Итак, оставайтесь со мной, пока мы исследуем ядро ​​Python.

В Python все является объектом, и вы можете спросить себя, что такое объект? согласно tutorialspoint, объект — это уникальный экземпляр класса. Объект включает в себя как элементы данных (переменные класса и переменные экземпляра), так и методы.. Поскольку ООП (объектно-ориентированное программирование) позволяет программистам думать, что они работают с объектами, лучший способ объясните это на примере.
Допустим, у нас есть объект из реальной жизни, например кошка
У кошки
есть атрибуты, которые представляют данные: Когти, Глаза
и кошка имеют действия, которые управляют этими данными: Почесать, следовать за красной точкой

А что, если я скажу вам, что не только кошка, но даже Когти, Глаза, Царапина, Следящая красная точка считаются объектами…? Круто, да? Мы только разогреваемся.

Все объекты в Python могут быть либо изменяемыми, либо неизменяемыми.

Неизменный — такие объекты, как: int, float, bool, str, tuple, bytes

Изменяемый – такие объекты, как: список, набор, словарь, массив.

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

А пока сделайте вдох, потому что мы идем глубоко.

ID и тип объекта

Каждый объект в Python имеет ID и тип.

ID —Идентификатор объекта, адрес памяти id(‹obj›)

>>> name = "Camilo"
>>> id(name)
40178544

Эти странно выглядящие числа — это адрес памяти, в компьютере все хранится где-то в памяти.

Тип —классификация объектатипа(‹obj›)

>>> type(name)
<class 'str'>

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

Так долго, так хорошо. Теперь мы знаем, что в python есть изменяемые и неизменяемые объекты, и что каждый объект не является встроенным, как в C, а экземпляром класса… Vamos! есть больше.

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

Как будет сказано ниже, изменяемые объекты можно изменять. Давайте посмотрим на наши надежные списки.

список1 представляет собой список целых чисел
список1 назначается списку2
4добавляется к списку1
список2 выводитсяс добавлением4 в список1 , но почему?

Это называется псевдоним, это происходит всякий раз, когда значение одной переменной присваивается другой переменной, поскольку мы создали псевдоним list1 с именем list2, эти имена указать на один и тот же объект. Используя функцию id(), мы можем получить больше информации.

idoflist1
› печатает id list1
idof list2
выводит идентификатор списка2
› Спрашивает, является ли список списком2
True
, но почему?

И list1, и list2 указывают на один и тот же объект, у них один и тот же идентификатор.
isоператор отличается от = =, в то время как один оценивает, является ли это одним и тем же объектом, другой оценивает, имеют ли они одно и то же значение.
is —
Тот же объект
== —
То же значение

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

Здесь id для list1 отличается от id для list2, они больше не указывают на один и тот же объект.

Неизменяемые объекты

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

tuple1 имеет значение (1, 2, 3)
› Изменение 0 позиции tuple1 на 4 >
› печатает содержимое tuple1
Ошибка, нет поддержки назначения элементов

Поскольку tuple является неизменяемым объектом, значение tuple1 нельзя изменить после создания. Поражен? просто прочитайте это…

Не все неизменяемые объекты на самом деле неизменны.

значение кортежа может относиться к разным типам данных, изменяемым типам данных…

tuple1 = (“Camilo”, [1, 2, 3])

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

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

Мы уже знаем, что такое изменяемый и неизменяемый объект, но какое это имеет значение, стоит ли еще раз ломать голову? Да, это того стоит.

Как программист, ваша миссия состоит в том, чтобы заставить компьютер выполнять ваши приказы, незнание и, что еще хуже, непонимание того, как все работает под капотом, может, например, нарушить ваш рабочий процесс.
Помните list1 и list2?, Python должен сделать копию list1, а затем переназначить все элементы списка, чтобы добавить в него новый элемент. Это не так эффективно с точки зрения памяти и времени.
Неизменяемые объекты, с другой стороны, быстрее, потому что весь объект не переназначается каждый раз, когда мы пытаемся изменить его — Python просто создаст новый объект с обновленное значение.

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

Как аргументы передаются функциям и что это означает для изменяемых и неизменяемых объектов

Python хранит переменные в памяти, как указатели в C, переменные хранят адрес (идентификатор) объекта.
Когда функция запрашивает аргументы, а мы передаем им объект, мы не передаем собственно объект, мы передаем ссылка объекта на функцию, адрес, поэтому любые изменения, сделанные функцией, будут выполняться по этому адресу.

Если мы передаем изменяемый объект в функцию и изменяем его значение, новое значение этого объекта становится доступным извне функции. Нравится:

Как показано в примере, ссылка x ссылка передается в func, теперь funcзнает, где должно произойти изменение. быть выполнено (адрес), поскольку модифицируется не фактический объект, а ссылка на него. После func мы видим список обновлений.

Теперь, если мы попробуем это с неизменяемым объектом, модификация внутри функции не будет доступна из-за пределов ее области видимости. Нравится:

x не был изменен внутри функции, тем не менее, он сохраняет исходное значение создания вне области действия func.

ООП является естественным, универсальным и мощным, зная, как все работает, от изменяемых до неизменяемых объектов, все только начинает обретать форму. Надеюсь, после этой истории вы сочтете, что ваш разум = взорван.
Удачного кодирования ;)!