JavaRush /Курси /Модуль 1: Python Core /Області видимості змінних

Області видимості змінних

Модуль 1: Python Core
Рівень 4 , Лекція 9
Відкрита

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 може бути використаний в реальних сценаріях для створення функції, яка зберігає свій стан між викликами.

Коментарі (2)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Максим Рівень 9
15 березня 2025
щось не дуже зрозуміло з

nonlocal
Anonymous #3584920 Рівень 7
2 червня 2025
nonlocal використовується у вкладених функціях, щоб вказати, що змінна посилається на попередньо зв'язану змінну в найближчій оточуючій, але неглобальній області видимості.