Этот урок посвящен функциям в Python, локальным и глобальным переменным, пространствам имен и областям видимости.
Локальные переменные
Переменные, созданные и используемые внутри функции, являются локальными. Они существуют только внутри функции, где определены.
Пример:
def fun(x1, x2):
c = x1 + x2
d = x1 * x2
return c, d
print(fun(3, 4)) # Выведет (7, 12)
print(c) # Выведет ошибку, так как переменная c локальна
Пространства имен и область видимости
Пространство имен — это место, где существуют имена объектов (переменных). Объект существует с момента присвоения ему значения.
Область видимости определяет, где имя объекта доступно коду. Эти понятия тесно связаны.
Глобальные переменные
Переменная, определенная вне функции, является глобальной. Ее можно использовать внутри функции.
Пример:
a = 2000
def fun(x1, x2):
c = x1 + x2 + a
return c
print(fun(3, 4)) # Выведет 2007
Однако, изменение глобальной переменной внутри функции не происходит автоматически:
a = 2000
def fun(x1, x2):
a = 1000 # Создается локальная переменная a
c = x1 + x2 + a
return c
print(fun(3,4)) # Выведет 1007
print(a) # Выведет 2000 - глобальная переменная не изменилась
Для изменения глобальной переменной внутри функции необходимо использовать ключевое слово global:
a = 2000
def fun(x1, x2):
global a
a = 1000
c = x1 + x2 + a
return c
print(fun(3, 4)) # Выведет 1007
print(a) # Выведет 1000 - глобальная переменная изменена
Изменяемые типы данных (например, списки) ведут себя иначе. Изменение элемента списка внутри функции меняет глобальный список:
a = [1, 2, 3]
def fun():
a[1] = 85
fun()
print(a) # Выведет [1, 85, 3]
Полная замена изменяемого объекта внутри функции создаст локальную копию:
a = [1, 2, 3]
def fun():
a = [10, 20, 30]
fun()
print(a) # Выведет [1, 2, 3] - глобальный список не изменился
Для изменения всего списка внутри функции, необходимо также использовать global:
a = [1, 2, 3]
def fun():
global a
a = [10, 20, 30]
fun()
print(a) # Выведет [10, 20, 30] - глобальный список изменен
Функции locals() и globals()
Функции locals() и globals() возвращают словари локального и глобального пространств имен соответственно:
global_var = 333333
list_nm = [1, 2, 3]
def my_fun():
local_var = 23
print(locals())
print(globals())
my_fun()
Порядок поиска имен
При обращении к имени переменной, Python ищет ее в следующем порядке:
- Локальная область видимости: внутри текущей функции.
- Локальная область видимости объемлющей функции: внутри функции, содержащей текущую функцию (для вложенных функций).
- Глобальная область видимости: внутри текущего модуля (файла .py).
- Встроенная область видимости: стандартный модуль builtins.
Понимание пространств имен и областей видимости является важным аспектом программирования на Python. Ключевое слово global позволяет управлять доступом к глобальным переменным из функций. Функции locals() и globals() предоставляют информацию о текущих пространствах имен.