Добавить в корзинуПозвонить
Найти в Дзене
Computer Science

Перевод Python 3.9.1 - Data model

3.1 Objects, values and types
Объекты-это абстракция Python для данных. Все данные в программе Python представлены объектами или отношениями между объектами. (В некотором смысле и в соответствии с моделью фон Неймана “stored-program computer” код также представлен объектами.)
Каждый объект имеет идентичность, тип и значение. Идентичность объекта никогда не меняется после его создания; вы можете

3.1 Objects, values and types

Объекты-это абстракция Python для данных. Все данные в программе Python представлены объектами или отношениями между объектами. (В некотором смысле и в соответствии с моделью фон Неймана “stored-program computer” код также представлен объектами.)

Каждый объект имеет идентичность, тип и значение. Идентичность объекта никогда не меняется после его создания; вы можете думать об этом как об адресе объекта в памяти. Оператор "is" сравнивает идентичность двух объектов; функция id() возвращает целое число, представляющее его идентичность.

Подробности реализации CPython: для CPython id(x) - это адрес памяти, где хранится x.

Тип объекта определяет операции, которые поддерживает объект (например, “имеет ли он длину?"), а также определяет возможные значения для объектов этого типа. Функция type() возвращает тип объекта (который является самим объектом). Как и его идентичность, тип объекта также неизменен. [1]

Значение некоторых объектов может меняться. Объекты, значение которых может изменяться, называются изменяемыми (mutable или мутабельными); объекты, значение которых остается неизменным после их создания, называются неизменяемыми (immutable или немутабельными). (Значение неизменяемого контейнерного объекта, содержащего ссылку на изменяемый объект, может изменяться при изменении значения последнего; однако контейнер по-прежнему считается неизменяемым, поскольку коллекция объектов, которую он содержит, не может быть изменена. Таким образом, неизменность-это не совсем то же самое, что иметь неизменяемые значения, она более тонкая.) Изменчивость объекта определяется его типом; например, числа, строки и кортежи неизменны, а словари и списки изменчивы.

Объекты никогда не уничтожаются явно; однако, когда они становятся недостижимыми, они могут быть собраны в мусор. Реализация может отложить сборку мусора или вообще опустить ее — это вопрос качества реализации, как осуществляется сбор мусора, до тех пор, пока не будут собраны объекты, которые все еще доступны.

Объекты никогда не уничтожаются явно; однако, когда они становятся недостижимыми, они могут быть собраны в мусор. Реализация может отложить сборку мусора или вообще опустить ее — это вопрос качества реализации сборщика мусора (gc, garbage collector), до тех пор пока объекты не собраны сборщиком - они всё ещё доступны.

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

Обратите внимание, что использование средств трассировки или отладки реализации может сохранять объекты "живыми", в то время как обычно они были бы собраны gc. Также обратите внимание, что перехват исключения с помощью оператора ‘try...except’ может сохранить объекты живыми.

Некоторые объекты содержат ссылки на ”внешние" (external) ресурсы, такие как открытые файлы или окна. Понятно, что эти ресурсы освобождаются, когда объект собирается мусором, но поскольку сборка мусора не гарантируется, у таких объектов есть явный способ освобождения ресурсов, обычно это метод close(). Программы настоятельно рекомендуют явно закрывать такие объекты. Оператор "try ... finally" и оператор "with" предоставляют удобные способы сделать это.

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

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

Типы влияют почти на все аспекты поведения объектов. Даже важность идентичности объекта влияет в каком-то смысле: для неизменяемых (immutable) типов, операции которые вычисляют новые значения на самом деле могут возвращать ссылку на любой существующий объект с тем же типом и значением, а для изменяемых (mutable) объектов это недопустимо. Т.е. после А = 1; B = 1, A и B не обязательно будет ссылаться на тот же объект со значением 1, это зависит от реализации, но после C = []; D = [], C и D гарантированно будут ссылаться на два уникальных, вновь созданных пустых списка. (Обратите внимание, что c = d = [] присваивает один и тот же объект как c, так и d.)