Альтернатива была бы довольно тяжелой - хранение «значений аргументов по умолчанию» в объекте функции в виде «фрагментов» кода, который будет выполняться снова и снова при каждом вызове функции без указания значения для этого аргумента - и было бы намного труднее получить раннее связывание (связывание во время определения времени), что часто является тем, чего вы хотите. Например, в Python, как он существует:
def ack(m, n, _memo={}):
key = m, n
if key not in _memo:
if m==0: v = n + 1
elif n==0: v = ack(m-1, 1)
else: v = ack(m-1, ack(m, n-1))
_memo[key] = v
return _memo[key]
... написание запомненной функции, подобной приведенной выше, является довольно элементарной задачей. Точно так же:
for i in range(len(buttons)):
buttons[i].onclick(lambda i=i: say('button %s', i))
... простой i=i
, опирающийся на раннее связывание (время определения) значений arg по умолчанию, является тривиально простым способом раннего связывания. Итак, текущее правило простое, прямое и позволяет вам делать все, что вы хотите, способом, который чрезвычайно легко объяснить и понять: если вы хотите позднее связывание значения выражения, оцените это выражение в теле функции; если вы хотите раннее связывание, оцените его как значение по умолчанию для аргумента.
Альтернатива принудительного позднего связывания для обеих ситуаций не обеспечит такой гибкости и вынудит вас проходить циклы (например, оборачивать вашу функцию в фабрику замыканий) каждый раз, когда вам нужно раннее связывание, как в приведенных выше примерах. - это еще более тяжелый шаблон, навязанный программисту этим гипотетическим дизайнерским решением (помимо «невидимых», возникающих при генерации и повторной оценке громких сигналов повсюду).
Другими словами: «Должен быть один, и желательно только один, очевидный способ сделать это [1]»: когда вы хотите позднего связывания, уже есть совершенно очевидный способ достичь этого (поскольку весь код функции выполняется только во время вызова, очевидно, что все оценивается там имеет позднюю привязку); оценка по умолчанию-arg приводит к раннему связыванию и дает очевидный способ достижения раннего связывания (плюс! -), а не ДВА очевидных способа позднего связывания и никакого очевидного способа раннего связывания (минус! -).
[1]: «Хотя этот путь поначалу может быть неочевидным, если вы не голландец».