10.1 Локальні змінні функції
У Python змінна доступна (до неї можна звертатися) з моменту свого створення і до кінця своєї області видимості — найчастіше це функція, в якій вона оголошена. Якщо змінна оголошена поза всіма функціями, то вона називається глобальною.
У Python області видимості змінних визначають контекст, в якому змінні доступні для використання. Області видимості допомагають уникнути конфліктів імен та керувати доступом до даних. Основні типи областей видимості в Python включають:
Локальна область видимості: Змінні, створені всередині функції, існують в локальній області видимості цієї функції і доступні лише в ній.
Область видимості вкладених функцій: Якщо функція визначена всередині іншої функції, її змінні доступні лише всередині цієї вкладеної функції.
Глобальна область видимості: Змінні, визначені на рівні скрипта або модуля, вважаються глобальними і доступні з будь-якої частини коду в тому ж модулі.
Вбудована область видимості: Це спеціальна область видимості, що включає в себе всі вбудовані об'єкти та функції Python, доступні за замовчуванням (наприклад, print() і len()).
Правило LEGB
Для розв'язання змінних Python використовує правило LEGB, яке визначає порядок, в якому інтерпретатор шукає змінні:
- L (Local) — Спочатку пошук в локальній області видимості.
- E (Enclosed) — Потім в областях видимості всіх вкладених функцій, від найближчої до зовнішньої.
- G (Global) — Далі в глобальній області видимості.
- B (Built-in) — Нарешті, в вбудованій області видимості.
Приклади використання
x = "global" # Глобальна змінна
def outer():
y = "outer local" # Локальна змінна зовнішньої функції
def inner():
z = "inner local" # Локальна змінна вкладеної функції
print(x) # Виведе "global"
print(y) # Виведе "outer local"
print(z) # Виведе "inner local"
inner()
outer()
Змінна z
доступна тільки всередині функції inner()
.
Змінна y
доступна всередині функції outer()
і у всіх функціях, оголошених всередині неї.
Змінна x
доступна всюди в поточному файлі (модулі).
10.2 Доступ до глобальних змінних: global x
Цікавою особливістю мови Python є те, що змінні з зовнішніх областей видимості (в яку вкладена поточна область видимості) можна лише читати.
При спробі записати щось у зовнішню змінну буде створена локальна змінна з таким же іменем, а доступ до зовнішньої змінної буде втрачено.
Приклад:
x = 10
def change_global():
print(x) # Це викликає помилку, так як x буде вважатися локальною змінною після присвоєння
x = 20 # Тут створиться локальна змінна x
print(x) # Виведе 20 (звернення йде до локальної змінної x)
change_global()
print(x) # Виведе 10
Цей приклад не працює і викликає помилку UnboundLocalError
, тому що інтерпретатор Python спочатку бачить присвоєння x = 20
і вважає, що x
є локальною змінною. Однак, коли інтерпретатор доходить до рядка print(x)
, він не знаходить локальної змінної x
, оскільки вона ще не була визначена.
Так зроблено для безпеки, щоб локальні змінні випадково не змінили глобальні.
Оператор global
Якщо тобі потрібно свідомо змінити значення глобальної змінної всередині функції, для цього можна використовувати оператор global
. Цей оператор дає можливість явно вказати, що зміна повинна відбутися саме в глобальній змінній, а не в локальній.
Щоб змінити значення глобальної змінної всередині функції, потрібно оголосити цю змінну на початку функції з допомогою global
. Це дає функції доступ на запис до змінної:
x = 10
def change_global():
global x # Оголошуємо x як глобальну змінну
print(x) # Виведе 10 (звернення йде до глобальної змінної x)
x = 20 # Тут присвоюємо нове значення глобальній змінній x
print(x) # Виведе 20 (звернення йде до глобальної змінної x)
change_global()
print(x) # Виведе 20
Використання оператора global
дозволяє уникнути помилки і правильно керувати глобальними змінними.
Глобальні змінні можуть зробити програму менш передбачуваною і важчою для розуміння, оскільки їх значення можуть бути змінені в будь-якому місці програми. Це особливо критично, якщо програма велика і розробляється групою програмістів.
Хоча іноді використання глобальних змінних неминуче, краще намагатися мінімізувати їх застосування. Замість глобальних змінних розглянь можливість використання параметрів функцій, повернених значень і класів для зберігання стану.
Використання глобальних змінних може призвести до несподіваних побічних ефектів, ускладнити відлагодження та тестування коду, а також знизити його повторне використання. Тому рекомендується використовувати глобальні змінні з обережністю і тільки коли це дійсно необхідно.
10.3 Доступ до не-локальних змінних: nonlocal
Крім глобальних і локальних змінних, у Python існують змінні з проміжних областей видимості. Наприклад, коли функція вкладена в іншу функцію. Для роботи з такими змінними використовується оператор nonlocal
.
Оператор nonlocal
дозволяє працювати зі змінними у вкладених функціях, змінюючи їх значення в найближчій області видимості, виключаючи глобальні змінні.
Оператор nonlocal
допомагає уникнути створення нової локальної змінної у вкладеній функції, коли потрібно змінити змінну, визначену у зовнішній функції. Без використання nonlocal
зміни зачеплять лише локальну змінну внутрішньої функції, не впливаючи на змінну у зовнішній функції.
Приклад:
def outer():
count = 0
def inner():
nonlocal count
count += 1
return count
return inner
counter = outer()
print(counter()) # Виведе 1
Ось більш практичний приклад використання nonlocal
для створення лічильника:
def create_counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
counter = create_counter()
print(counter()) # Виведе 1
print(counter()) # Виведе 2
print(counter()) # Виведе 3
Цей приклад демонструє, як nonlocal
може бути використаний в реальних сценаріях для створення функції, яка зберігає свій стан між викликами.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ