Phương án thay thế sẽ khá nặng - lưu trữ "giá trị đối số mặc định" trong đối tượng hàm như "khối" của mã được thực hiện lặp đi lặp lại mỗi lần hàm được gọi mà không có giá trị được chỉ định cho đối số đó - và sẽ làm cho nó khó khăn hơn nhiều để có được ràng buộc sớm (ràng buộc tại thời gian def), mà thường là những gì bạn muốn. Ví dụ: bằng Python khi nó tồn tại:
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]
... viết một chức năng ghi nhớ như trên là một nhiệm vụ khá cơ bản.Tương tự như vậy:
for i in range(len(buttons)):
buttons[i].onclick(lambda i=i: say('button %s', i))
... đơn giản i=i
, dựa trên (thời gian định nghĩa) sớm ràng buộc của các giá trị arg mặc định, là một cách đơn giản để có được trivially đầu ràng buộc. Vì vậy, quy tắc hiện tại đơn giản, đơn giản và cho phép bạn làm tất cả những gì bạn muốn theo cách rất dễ giải thích và hiểu: nếu bạn muốn gắn kết muộn giá trị của một biểu thức, hãy đánh giá biểu thức đó trong thân hàm; nếu bạn muốn kết nối sớm, hãy đánh giá nó như là giá trị mặc định của một arg.
Cách khác, buộc ràng buộc trễ cho cả hai trường hợp, sẽ không cung cấp tính linh hoạt này và sẽ buộc bạn phải trải qua các vòng lặp (chẳng hạn như gói hàm của bạn vào nhà máy đóng cửa) mỗi khi bạn cần ràng buộc sớm, như ở trên ví dụ - nhưng nặng hơn boilerplate trọng lượng buộc trên lập trình bởi quyết định thiết kế giả thiết này (ngoài những "vô hình" của việc tạo ra và liên tục đánh giá khối khắp nơi).
Nói cách khác, "Nên có một, và tốt nhất là chỉ một cách rõ ràng để làm điều đó:" khi bạn muốn kết buộc muộn, đã có một cách hoàn toàn rõ ràng để đạt được nó (vì tất cả các chức năng của mã chỉ được thực thi tại thời điểm gọi, rõ ràng là mọi thứ được đánh giá có bị trễ); có đánh giá mặc định-arg sản xuất ràng buộc sớm mang đến cho bạn một cách rõ ràng để đạt được ràng buộc sớm (cộng! -) thay vì cho HAI cách rõ ràng để có được ràng buộc muộn và không có cách rõ ràng để có được ràng buộc sớm (một trừ! -).
[1]: "Mặc dù cách này có thể không rõ ràng lúc đầu trừ khi bạn là người Hà Lan".
Dự đoán của tôi sẽ là hiệu suất. Hãy tưởng tượng đánh giá lại mỗi khi một hàm được gọi nếu nó được gọi là 15 triệu lần một ngày. –