О том, как все является объектом в мире Python

Запуск Python3 переносит вас в мир, состоящий из объектов, ссылок между указанными объектами и методов, которые с ними работают. Цель состоит в том, чтобы вы лучше подготовились к пониманию парадигмы Python, чтобы вы могли понимать его язык.

В объектно-ориентированной парадигме класс - это проект, содержащий атрибуты и методы, которыми он управляет. объект - это экземпляр класса, во многом похожий на дом, являющийся экземпляром базового чертежа. Атрибуты и методы, определенные в базовом классе, доступны в любом экземпляре класса. Строки, числа с плавающей запятой, целые числа и списки - все это допустимые примеры классов в языке. Инициализация переменной и привязка ее к определенному значению называется созданием экземпляра, что означает создание объекта, принадлежащего определенному классу. Основываясь на приведенном ниже примере, левая часть «присвоения переменной» - это имя переменной, а правая часть - это конкретный объект, созданный в памяти. Это имя привязано к объекту в памяти, содержащему значение 1. В таком языке, как C, переменная похожа на «ящик», содержащий присвоенное значение, и в этом заключается разница с Python. Значения, созданные в пространстве Python, являются объектами, принадлежащими определенным классам, а переменные - просто ссылками на эти объекты. Код состоит из манипулирования объектами, и эта философия пронизывает все аспекты языка.

>>> # Example of instantiating an int object
>>> a = 1
>>> type(a)
<class 'int'>
>>> string1 = "Hemant"
>>> type(string1)
<class 'str'>
>>> # Demonstrating the use of a string method on the object "Hemant"
>>> string1.upper()
'HEMANT'

Встроенная функция type () возвращает класс, к которому принадлежит объект.

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

>>> a = 1
>>> b = 1

В приведенном выше коде есть 2 имени переменных, которые относятся к одному и тому же значению. В C эти переменные будут хранить одно и то же значение в разных ячейках памяти в стеке. Однако помните, что имена переменных - это просто теги, которые ссылаются на объект в памяти. Суть этого обсуждения в том, что a и b в конечном итоге указывают на один и тот же объект «1» в памяти!

>>> a is b
True
>>> a == b
True

Использование операторов ‘is’ и ‘==’ в именах переменных возвращает True в обоих случаях. Первый оператор проверяет, относятся ли имена к одному и тому же объекту. Переменные в Python - это имена, которые ссылаются на объекты, созданные в памяти. Последний оператор проверяет равенство значений объекта, которое возвращает True, поскольку a и b указывают на одно и то же значение. Возвращаемое значение оператора is может быть подтверждено с помощью функции id (). Эта функция возвращает уникальное целое число, представляющее адрес памяти базового объекта.

>>> id(a)
10088288
>>> id(b)
10088288

Значение, возвращаемое функцией id (), одинаково, что означает, что a и b относятся к одному и тому же объекту.

Мутабельные объекты

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

>>> my_list = [1, 2, 3]
>>> my_list[2] = 5
>>> my_list
[1, 2, 5]

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

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

>>> string1 = "Hemant"
>>> string1[2] = 'c'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> # This same traceback is seen when attempting to assign value in an immutable object like a tuple

Почему это важно и как Python обрабатывает изменяемые и неизменяемые объекты?

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

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

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

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