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