По сути, единственное, что в Python, которое вводит новую область видимости, - это определение функции. Классы - это немного особый случай, когда все, что определено непосредственно в теле, помещается в пространство имен класса, но они не доступны непосредственно из методов (или вложенных классов), которые они содержат.
В вашем Например, есть только 3 области, где x будет искать в:
Больше областей появляется только при введении вложенной функции (или лямбда) в изображение. Они будут вести себя так, как вы ожидали. Вложенная функция может получить доступ ко всем в локальной области, а также к любой области приложения. например,
def foo():
x=4
def bar():
print x # Accesses x from foo's scope
bar() # Prints 4
x=5
bar() # Prints 5
Ограничения:
Доступ к переменным в областях, отличных от переменных локальной функции, но не может отскочить к новым параметрам без дальнейшего синтаксиса. Вместо этого назначение создает новую локальную переменную вместо того, чтобы влиять на переменную в родительской области. Например:
global_var1 = []
global_var2 = 1
def func():
# This is OK: It's just accessing, not rebinding
global_var1.append(4)
# This won't affect global_var2. Instead it creates a new variable
global_var2 = 2
local1 = 4
def embedded_func():
# Again, this doen't affect func's local1 variable. It creates a
# new local variable also called local1 instead.
local1 = 5
print local1
embedded_func() # Prints 5
print local1 # Prints 4
Чтобы действительно изменить привязки глобальных переменных из области видимости функции, вам нужно указать, что переменная глобальна с ключевым словом global. Например:
global_var = 4
def change_global():
global global_var
global_var = global_var + 1
В настоящее время нет способа сделать то же самое для переменных в приложении областей function , но Python 3 вводит новое ключевое слово «nonlocal
», которое будет действуют аналогично глобальным, но для вложенных областей функций.