Python — замечательный язык, но, начиная с C, можно немного запутаться в том, что на самом деле делают объекты. Что является или не является объектом? Есть типы объектов, идентификаторы объектов, изменяемые объекты, неизменяемые объекты — это может быть ошеломляющим. Итак, вот краткий обзор некоторых характеристик объектов Python.

Тип объекта — это класс, к которому он принадлежит. Например, целые числа имеют тип объекта int, строки str и так далее. Python также позволяет программисту создавать классы. Чтобы получить доступ к типу объекта, мы можем использовать функцию type(), или чтобы проверить, является ли объект экземпляром данного класса, используйте isinstance([object], [type]). Однако идентификатор объекта немного отличается. Попробуйте проверить идентификатор любого объекта, используя id(). Будет возвращено число, представляющее собой адрес памяти, по которому хранится объект.

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

Если мы посмотрим на список, скажем, [1, 2, 3], мы можем присвоить его двум переменным по отдельности:

Мы видим, что, несмотря на то, что списки имеют одинаковое содержимое, они представляют собой два отдельных объекта. Простой тест a is b вернет False, потому что на эти два объекта можно воздействовать отдельно. Это известно как изменчивость. Если мы добавим один из списков, мы увидим, что они действительно разделены.

Чтобы две переменные указывали на один и тот же изменяемый объект, нам пришлось бы присваивать b = a вместо того, чтобы присваивать его одному и тому же списку.

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

Хотя переменная a все еще существует, она переназначается новому объекту str, о чем свидетельствуют разные идентификаторы.

Следует помнить, что более короткие строки неизменяемого типа будут храниться в памяти как один объект. Например:

Однако для более длинных строк это может быть не так. Всегда проверяйте с помощью a is b, прежде чем определить, действительно ли два объекта одинаковы.

Передача переменных в функции

Попытка изменить разные переменные с помощью функции имеет разные последствия для изменяемых и неизменяемых типов. Например:

Передача неизменяемого типа в функцию без возврата не изменит переменную. b был определен в рамках нашей основной функции, но когда он передается в switch, он модифицируется только как a в рамках switch. Когда мы покидаем функцию switch, a больше не находится в пространстве имен, поэтому b указывает на ту же строку, что и раньше.

Изменяемые переменные обрабатываются противоположным образом. Если мы попробуем ту же концепцию со списком, мы получим такой результат.

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

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