Это закрытие Python?(или почему этот код работает?) - PullRequest
0 голосов
/ 16 марта 2011

Мне интересно, почему работает следующий код Python:

def sum(a, b):
    return a+b+c
c=3
print sum(1,2)
# result: 6

Я бы ожидал ошибку компиляции.
Как можно определить функцию sum, если переменная c отсутствует (я бы сказал, что c не входит в область действия функции sum)?

Это то, что они называют закрытием?

Как я понял замыкания, переменная уже должна была быть "упомянута", как в следующих фрагментах кода (скопировано с с этого сайта ). Здесь x уже упоминается (хотя и не «заполнен») выше определения функции inc().

def makeInc(x):
  def inc(y):
     # x is "closed" in the definition of inc
     return y + x

Ответы [ 3 ]

6 голосов
/ 16 марта 2011

В этом случае c находится в таблице глобалов. Если вы попытаетесь вызвать sum(1,2), а c не может быть найдено в области действия функции или ее родительской области (глобальной области), то вы получите исключение NameError.

Хотя это похоже на замыкание, доступ к глобальным переменным внутри тела функции обычно не одобряется, так как это значительно затрудняет отладку. Лучший пример именованного замыкания в python (из Википедии):

def outer():
    y = 0
    def inner():
        nonlocal y
        y += 1
        return y
    return inner

f = outer() 
print(f(), f(), f()) #prints 1 2 3

Для получения дополнительной информации см. Статью в Википедии о замыканиях: Пример Python .

4 голосов
/ 16 марта 2011

Python выдаст ошибку, если переменная не определена при вызове функции.
Вы вызываете Sum, когда определено c.

3 голосов
/ 16 марта 2011

Python не оценивает тело суммы, пока она не будет вызвана.Поскольку c определяется до вызова sum, он доступен для использования sum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...