все Python 3Функциипонятие
Локальные и глобальные переменные
область видимости
LEGB-правило: Local → Enclosing → Global → Built-in. Локальная переменная существует только внутри функции.
Синтаксис
x = 10 # глобальная
def f():
x = 5 # локальная
Главная грабля: любое присваивание имени внутри функции делает его локальным на всё тело — поэтому прочитать глобальную x, а ниже написать x = ..., нельзя, будет UnboundLocalError уже на чтении. Читать глобальные можно без объявления, но чтобы присвоить именно глобальной, а не создать новую локальную, нужен global; для переменной из объемлющей функции — nonlocal.
Примеры
x = 'global'
def f():
x = 'local'
print(x) # → local
f()
print(x) # → global
count = 0
def inc():
global count
count += 1
inc()
print(count) # → 1
def outer():
n = 10
def inner():
nonlocal n
n += 1
inner()
return n
print(outer()) # → 11
# Ловушка: чтение до присваивания
x2 = 5
def bad():
print(x2) # UnboundLocalError!
x2 = 10
# Встроенные имена
def f2():
print(len([1,2,3])) # → 3 (built-in)
f2()
# Enclosing
def outer2():
msg = 'hi'
def inner2():
print(msg) # → hi (enclosing)
inner2()
outer2()
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности