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

Область видимості або scope визначає контекст змінної, в рамках якого її можна використовувати. У Python є два типи контексту: глобальний та локальний.

Глобальний контекст значить, що змінна є глобальною, вона визначена поза будь-якою з функцією і доступна будь-якій функції в програмі. Наприклад:

name = "Tom"     

def say_hi(): 
    print("Hello", name)     

def say_bye():  
    print("Good bye", name)  

say_hi()  
say_bye()

Тут змінна name є глобальною і має глобальну область видимості. І обидві визначені тут функції можуть вільно її використовувати.

На відміну від глобальних змінних локальна змінна визначається всередині функції і доступна тільки з цієї функції, тобто має локальну область видимості:

def say_hi():  
    name = "Sam"  
    surname = "Johnson"  
    print("Hello", name, surname)     

def say_bye():  
    name = "Tom"  
    print("Good bye", name)     

say_hi()  
say_bye()

В даному випадку в кожній з двох функцій визначається локальна змінна name. І хоча ці змінні називаються однаково, але тим не менше це дві різних змінних, кожна з яких доступна тільки в рамках своєї функції. Також в функції say_hi визначена змінна surname, яка також є локальною, тому в функції say_bye ми її використовувати не зможемо.

Є ще один варіант визначення змінної, коли локальна змінна приховує глобальну з тим же іменем:

name = "Tom"     

def say_hi(): 
    print("Hello", name)     

def say_bye():  
    name = "Bob"  
    print("Good bye", name)     

say_hi() # Hello Tom  
say_bye() # Good bye Bob

Тут визначена глобальна змінна name. Однак у функції say_bye визначена локальна змінна з тим же ім'ям name. І якщо функція say_hi використовує глобальну змінну, то функція say_bye використовує локальну змінну, яка приховує глобальну.

Якщо ж ми хочемо змінити в локальній функції глобальну змінну, а не визначити локальну, то необхідно використовувати ключове слово global:

def say_bye():  
    global name 
    name = "Bob"
    print("Good bye", name)

В Python, як і в багатьох інших мовах програмування, не рекомендується використовувати глобальні змінні. Єдиною допустимою практикою є визначення невеликого числа глобальних констант, які не змінюються в процесі роботи програми.

PI = 3.14      

# обчислення площі кола  
def get_circle_square(radius):  
    print("Площа кола з радіусом", radius, "дорівнює", PI * radius * radius)  

get_circle_square(50)  

В даному випадку число 3.14 представлено константою PI. Зрозуміло, що це значення в принципі не зміниться, тому його можна винести з функцій і визначити у вигляді константи. Як правило, ім'я константи визначається великими літерами.