Scope в Пайтоне

Я продолжаю книгу на python но оно мне казалось сомнением относительно scope, у меня есть следующий код:

pi = 3.14
def crear_area(pi = pi):
    def area(r):
        return pi*r*r
    return area

area = crear_area(10)
print(area(10))  #valor de retorno es 314.5
pi = 12
print(area(10))  #valor de retorno es 314.5

Они могут объяснять мне, потому что изменение объекта pi я не затрагиваю результат, а следовательно я вижу python если он манипулирует статическим scope.

2
задан 13.03.2016, 08:38
1 ответ

Это пример закрытий (closure на английском) и тот, как они функционируют.

Когда ты определяешь функцию crear_area, ты создаешь локальную переменную в эту функцию с именем pi и со стандартной настройкой pi (глобальный):

def crear_area(pi = pi):

Сейчас, внутри этой функции, ты определяешь вторую функцию area что возвращается как результат / объект:

pi = 3.14
def crear_area(pi = pi):
    def area(r):
        return pi*r*r
    return area

Как область (scope на английском) area он исключительно внутри crear_area и Ваши переменные, не важно, чтобы ты изменил стоимость глобальной переменной pi, потому что area всегда будешь использовать локальную переменную pi crear_area у которого была стоимость 3.14 во время Вашего определения.

И это мотив, из-за которого, хотя ты изменишь стоимость pi (глобальный), print(area(10)) всегда будешь возвращать то же самое: внутренние переменные поддерживают Вашу стоимость внутри закрытия.


Если ты хочешь, чтобы у них была различная стоимость, тогда ты был бы должен создавать нового area происходя pi как параметр (так не был бы использован стандартная настройка а новый, что ты перемещаешь):

pi = 3.14
def crear_area(pi = pi):
    def area(r):
        return pi*r*r
    return area

area = crear_area()
print(area(10))  #valor de retorno es 314.0
pi = 3  #referencia a Futurama
area = crear_area(pi)
print(area(10))  #valor de retorno es 300

Таким образом ты создавал бы новую среду с новыми переменными и "resetearían" стоимость для area.


Другая возможная альтернатива, он состоял бы в том, чтобы не определять локальную переменную pi и так всегда была бы использована глобальная, получая различную стоимость:

pi = 3.14
def crear_area():
    def area(r):
        return pi*r*r #ahora este pi es la variable global
    return area

area = crear_area()
print(area(10))  #valor de retorno es 314.0
pi = 3  #referencia a Futurama
print(area(10))  #valor de retorno es 300
5
ответ дан 24.11.2019, 14:44
  • 1
    Большое спасибо, я понимаю очень хорошо, просвет у внутренних функций есть способность распознавать стоимость пары и # 225; метры, определенные внутри closure и этих пара и # 225; метры быть и # 225; n локальной области в closure. – julian salas 13.03.2016, 20:17