Область видимости или scope определяет контекст переменной, в рамках которого ее можно использовать. В Python есть два типа контекста: глобальный и локальный.
Глобальный контекст подразумевает, что переменная является глобальной, она определена вне любой из функций и доступна любой функции в программе. Например:
| 1 2 3 4 5 6 7 8 9 10 11 12 | name = "Tom" def say_hi():print("Hello", name) def say_bye():print("Good bye", name)say_hi()say_bye() |
Здесь переменная name является глобальной и имеет глобальную область видимости. И обе определенные здесь функции могут свободно ее использовать.
В отличие от глобальных переменных локальная переменная определяется внутри функции и доступна только из этой функции, то есть имеет локальную область видимости:
| 1 2 3 4 5 6 7 8 9 10 11 12 | 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 мы ее использовать не сможем.
Есть еще один вариант определения переменной, когда локальная переменная скрывают глобальную с тем же именем:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | name = "Tom" def say_hi():print("Hello", name)def say_bye():name = "Bob"print("Good bye", name)say_hi() # Hello Tomsay_bye() # Good bye Bob |
Здесь определена глобальная переменная name. Однако в функции say_bye определена локальная переменная с тем же именем name. И если функция say_hi использует глобальную переменную, то функция say_bye использует локальную переменную, которая скрывает глобальную.
Если же мы хотим изменить в локальной функции глобальную переменную, а не определить локальную, то необходимо использовать ключевое слово global:
| 1 2 3 4 | def say_bye():global namename = "Bob"print("Good bye", name) |
В Python, как и во многих других языках программирования, не рекомендуется использовать глобальные переменные. Единственной допустимой практикой является определение небольшого числа глобальных констант, которые не изменяются в процессе работы программы.
| 1 2 3 4 5 6 7 8 9 | PI = 3.14 # вычисление площади кругаdef get_circle_square(radius): print("Площадь круга с радиусом", radius, "равна", PI * radius * radius)get_circle_square(50) |
В данном случае число 3.14 представлено константой PI. Понятно, что это значение в принципе не изменится, поэтому его можно вынести из функций и определить в виде константы. Как правило, имя константы определяется заглавными буквами.