О том, как все является объектом в мире 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. Имена переменных связаны с объектами в памяти, поэтому можно иметь несколько ссылок на один и тот же объект. Изменяемость влияет на поведение при перемещении данных в функции и из них.