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

Объекты

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

Тип () и идентификатор ()

Функция type проверяет и возвращает тип данных, связанный с объектом, на который ссылается данная переменная, так что:

>>> a = 10
>>> type(a)
<class = 'int'>

Функция id проверяет и возвращает уникальный номер, представляющий адрес памяти объекта. Поскольку переменные - это просто указатели на объекты, две разные переменные с одинаковым значением (и, следовательно, объект) будут иметь одинаковый идентификатор. Помните, что идентификатор объекта на разных машинах может быть разным.

>>> a = 10
>>> b = 10
>>> id(a)
10105376
>>> id(b)
10105376

также:

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

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

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

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

Изменяемые объекты включают списки, словари и наборы (кроме frozenset()). Как видно из приведенного ниже примера, идентификатор списка «l» не меняется, даже если его значение:

>>> l = [1, 2, 3]
>>> id(l)
140457156645192
>>> l[1] = 7
>>> id(l)
140457156645192

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

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

>>> a = 10
>>> id(a)
10105376
>>> a = a + 1
>>> id(a)
10105408

Как вы можете видеть выше, после изменения значения integer a изменяется и его id, потому что теперь он указывает на другой объект и другое пространство в памяти. Неизменяемые объекты в Python включают числа (целые числа и числа с плавающей запятой), строки, логические значения, кортежи и многое другое.

Объекты как аргументы

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

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

>>> mutable_value = [1, 2, 3]
>>> def f(n):
...     n[1] = 33
...     return n
...
>>> id(mutable_value)
140457124365576
>>> mutable_value = f(mutable_value)
>>> id(mutable_value)
140457124365576

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

>>> a = 99
>>> def f(a):
...     a += 1
...     return a
...
>>> id(a)
10108224
>>> a = f(a)
>>> id(a)
10108256
>>> a
100

Как вы можете видеть выше, было изменено значение, на которое a указывает, но не значение объекта, на который он изначально указывал (id 10108224). Чтобы изменить точку, на которую указывает a, python должен был создать совершенно новый объект с идентификатором 10108256.





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