Об’єкти, значення та типи
Оновлено: 28.04.2023
Об’єкти — це абстракція Python для даних. Усі дані в програмі Python представлені об’єктами або зв’язками між об’єктами. (У певному сенсі та відповідно до моделі фон Неймана «комп’ютера зі збереженою програмою» код також представлений об’єктами.)
Кожен об’єкт має ідентифікатор, тип і значення. Ідентичність об’єкта ніколи не змінюється після його створення; ви можете думати про це як про адресу об’єкта в пам’яті. Оператор „is“ порівнює ідентичність двох об’єктів; функція id() повертає ціле число, що представляє його ідентифікатор.
Тип об’єкта визначає операції, які об’єкт підтримує (наприклад, «чи має він довжину?»), а також визначає можливі значення для об’єктів цього типу. Функція type() повертає тип об’єкта (який сам є об’єктом). Як і його ідентифікатор, type об’єкта також не змінюється. 1
Значення деяких об’єктів може змінюватися. Об’єкти, чиє значення може змінюватися, називаються змінними; об’єкти, значення яких не змінюються після їх створення, називаються незмінними. (Значення незмінного об’єкта-контейнера, що містить посилання на змінний об’єкт, може змінюватися, коли змінюється значення останнього; однак контейнер усе ще вважається незмінним, оскільки набір об’єктів, який він містить, не можна змінити. Таким чином, незмінність не є строго те саме, що має незмінне значення, воно більш тонке.) Змінність об’єкта визначається його типом; наприклад, числа, рядки та кортежі незмінні, тоді як словники та списки змінні.
Об’єкти ніколи не знищуються явно; однак, коли вони стають недоступними, вони можуть бути зібрані сміттям. Реалізації дозволено відкладати збирання сміття або взагалі опускати його — це питання якості реалізації, як реалізовано збирання сміття, доки не збираються об’єкти, які все ще доступні.
Зауважте, що використання засобів трасування або налагодження реалізації може зберегти живими об’єкти, які зазвичай можна зібрати. Також зауважте, що перехоплення винятку за допомогою оператора „try…except“ може зберегти об’єкти живими.
Деякі об’єкти містять посилання на «зовнішні» ресурси, такі як відкриті файли або вікна. Зрозуміло, що ці ресурси звільняються, коли об’єкт збирає сміття, але оскільки збір сміття не гарантовано відбудеться, такі об’єкти також надають явний спосіб звільнити зовнішній ресурс, як правило, метод close(). Програмам настійно рекомендується явно закривати такі об’єкти. Оператор „try…finally“ і оператор „with“ пропонують зручні способи зробити це.
Деякі об’єкти містять посилання на інші об’єкти; вони називаються контейнерами. Прикладами контейнерів є кортежі, списки та словники. Посилання є частиною значення контейнера. У більшості випадків, коли ми говоримо про значення контейнера, ми маємо на увазі значення, а не ідентифікацію об’єктів, що містяться; однак, коли ми говоримо про мінливість контейнера, мається на увазі лише ідентичність об’єктів, які безпосередньо містяться. Отже, якщо незмінний контейнер (наприклад, кортеж) містить посилання на змінний об’єкт, його значення змінюється, якщо змінюється цей змінний об’єкт.
Типи впливають майже на всі аспекти поведінки об’єктів. Навіть важливість ідентичності об’єкта в певному сенсі вплинула: для незмінних типів операції, які обчислюють нові значення, можуть фактично повернути посилання на будь-який існуючий об’єкт з тим самим типом і значенням, тоді як для змінних об’єктів це неприпустимо. Наприклад, після a = 1; b = 1, a і b можуть або не можуть посилатися на той самий об’єкт зі значенням один, залежно від реалізації, але після c = []; d = [], c і d гарантовано посилаються на два різні, унікальні, щойно створені порожні списки. (Зверніть увагу, що c = d = [] призначає той самий об’єкт як c, так і d.)