Область видимости переменных

Поділитись

Область видимости или 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 name
name = "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. Понятно, что это значение в принципе не изменится, поэтому его можно вынести из функций и определить в виде константы. Как правило, имя константы определяется заглавными буквами.


Поділитись