Что такое «лямбда-связывание» в Python? - PullRequest
11 голосов
/ 02 октября 2008

Я понимаю, что такое лямбда-функции в Python, но я не могу понять, что означает «привязка лямбда», просматривая документы Python. Ссылка, чтобы прочитать об этом было бы здорово. Тривиальный объясненный пример был бы еще лучше. Спасибо.

Ответы [ 3 ]

14 голосов
/ 02 октября 2008

Во-первых, общее определение:

Когда оператор программы или функции выполняется, текущие значения формальные параметры сохраняются (на стек) и в рамках Заявление, они связаны с значения фактических аргументов, сделанных в вызов. Когда заявление выход, исходные значения тех формальные аргументы восстановлены. это Протокол полностью рекурсивный. Если внутри тело утверждения, что-то сделано, что вызывает формальные параметры быть привязанным снова, к новым ценностям, Лямбда-связывающая схема гарантирует, что все это произойдет упорядоченно образом.

Теперь в обсуждении приведен отличный пример python :

"... существует только одна привязка для x: выполнение x = 7 просто меняет значение в существующей привязке. Вот почему

def foo(x): 
   a = lambda: x 
   x = 7 
   b = lambda: x 
   return a,b

возвращает две функции, которые возвращают 7; если после x = 7 была новая привязка, функции возвращали бы разные значения [конечно, при условии, что вы не вызываете foo (7). Также предполагается, что nested_scopes] .... "

8 голосов
/ 02 октября 2008

Я никогда не слышал этот термин, но одним из объяснений может быть хак "параметр по умолчанию", используемый для назначения значения непосредственно параметру лямбды. Используя пример Свати:

def foo(x): 
    a = lambda x=x: x 
    x = 7 
    b = lambda: x 
    return a,b

aa, bb = foo(4)
aa() # Prints 4
bb() # Prints 7
1 голос
/ 02 октября 2008

Где вы видели использованную фразу?

«Связывание» в Python, как правило, относится к процессу, с помощью которого имя переменной в конечном итоге указывает на конкретный объект, будь то путем присваивания или передачи параметра или каким-либо другим способом, например ::

a = dict(foo="bar", zip="zap", zig="zag") # binds a to a newly-created dict object
b = a # binds b to that same dictionary

def crunch(param):
  print param

crunch(a) # binds the parameter "param" in the function crunch to that same dict again

Итак, я бы предположил, что «лямбда-привязка» относится к процессу привязки лямбда-функции к имени переменной или, возможно, к привязке ее именованных параметров к конкретным объектам? В справочнике по языку есть довольно хорошее объяснение привязки: http://docs.python.org/ref/naming.html

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