Змінні
📌 Визначення
- Змінна — це ім’я (name), яке посилається на об’єкт у пам’яті; тип об’єкта визначається під час виконання, отже Python має динамічну типізацію — ім’я можна переприв’язати до будь-якого об’єкта будь-коли.
- Оголошення не потрібне: ім’я з’являється при першому присвоєнні.
x = 42 # int
x = "привіт" # тепер x посилається на str
Змінні — це лише ярлики на об’єкти.
📌 Присвоєння
- x = 10 одне ім’я ← один об’єкт
- x = y = z = 0 ланцюгове присвоєння усім одже значення 0
- a, b = 1, 2 розпакування кортежу
- a, b = b, a “python-style” обмін значень без тимчасової змінної
Під капотом
- присвоєння просто створює новий зв’язок «ім’я → об’єкт»;
- попередній об’єкт звільняється, коли на нього більше немає посилань (лічильник посилань + збірник сміття).
Оператор del * del x видаляє зв’язок імені з об’єктом із поточної області видимості; * якщо посилань не лишилось — об’єкт звільняється
📌 Правила іменування (синтаксис)
- Починається з букви або _.
- Далі — букви, цифри, підкреслення.
- Чутливість до регістру: age, Age, AGE — різні імена.
- Не можна використовувати зарезервовані ключові слова (for, type, print, …).
📌 Стиль PEP 8 (конвенції)
Елемент Рекомендація Приклади Змінні / функції snake_case, коротко, виразно total_price, user_id Константи (модульні) UPPER_CASE_WITH_UNDERSCORES MAX_RETRIES = 5 Уникати односимвольних l, O, I; вони схожі на 1 і 0
“Приватні” атрибути _leading_underscore
Сильне “приватне” (name-mangling) __double_leading (už для запобігання конфліктам у підкласах)
PEP 8 дозволяє mixedCase тільки там, де це вже історично склалось.
📌 Області видимості та LEGB
Python шукає ім’я у такому порядку:
Local → Enclosing (вкладені функції) → Global (модуль) → Built-in.
- global x - оголошує, що всередині функції ми звертаємось до змінної x з модуля, а не створюємо локальну
- якщо в глобальній області немає такї, то вона створюється
- nonlocal x - дає доступ до змінної з найближчої зовнішньої функції, дозволяє змінювати її
count = 0 # global
def outer():
total = 0 # enclosing
def inner():
nonlocal total
total += 1
📌 Типи змінних (вбудовані об’єкти)
- Числа: int, float, complex
- Булеві: bool (True, False)
- Послідовності: str, list, tuple, range
- Мапи та множини: dict, set, frozenset
- Спеціальні: bytes, bytearray, memoryview, NoneType
Python автоматично визначає тип за значенням; змінна може змінити тип у ході роботи програми. Великих чисел допускає розділювач '_' для читабельності: tokens_per_sec = 1_000_000
📌 Ідентичність, рівність та id()
- Ідентичність a is b чи посилаються обидва імені на той самий об’єкт
- Рівність a == b чи рівні значення (визначає метод
__eq__
) - id(obj) id(a) «адреса» об’єкта (гарантовано унікальна, поки об’єкт існує)
a = [1, 2]
b = a
c = [1, 2]
a is b # True
a == c # True, але
a is c # False
📌 Поради та хитрощі
- swap: x, y = y, x — швидкий обмін без тимчасової змінної.
- unused variables: використовуйте _ або _unused як ім’я-заглушку.
- аnnotations: age: int = 18 — лише підказка, тип все ще не фіксується.
- іn-place оператори (+=, -=, …) можуть працювати швидше на mutable-об’єктах, бо намагаються змінити існуючий об’єкт.
- Для великих програм дотримуйтесь PEP 8, щоб код лишався читабельним та однорідним.