Что такое «лямбда-привязка» в Python?
Вопрос
Я понимаю, что такое лямбда-функции в Python, но не могу найти значение «лямбда-привязки», выполнив поиск в документации Python.Ссылка, где можно почитать об этом, была бы замечательна.Тривиальный объясненный пример был бы еще лучше.Спасибо.
Решение
Сначала общее определение:
Когда выполняется оператор программы или функции, текущие значения формальных параметров сохраняются (в стеке), а в рамках оператора они связаны со значениями фактических аргументов, сделанных в вызове.Когда утверждение выходит, исходные значения этих формальных аргументов восстанавливаются.Этот протокол полностью рекурсивный.Если в рамках тела утверждения что-то сделано, что приводит к тому, что формальные параметры снова будут связаны, с новыми значениями, схема связывания Lambda гарантирует, что все это произойдет упорядоченным образом.
Теперь есть отличный пример Python в обсуждении здесь:
"...есть только одна привязка для x
:делает x = 7
просто меняет значение в уже существующей привязке.Вот почему
def foo(x):
a = lambda: x
x = 7
b = lambda: x
return a,b
возвращает две функции, обе из которых возвращают 7;если была новая привязка после x = 7
, функции будут возвращать разные значения [конечно, при условии, что вы не вызываете foo(7).Также предполагается, что вложенные_области]..."
Другие советы
Я никогда не слышал этот термин, но одним из объяснений может быть хак «параметра по умолчанию», используемый для присвоения значения непосредственно параметру лямбды.Используя пример Свати:
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
Где вы видели использование этой фразы?
«Привязка» в 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