Изменяемые и неизменяемые объекты в 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.
В жизни есть нечто большее, чем код. Загляните в нижнюю часть моих блогов, чтобы найти рекомендации по песням-убийцам: