cuộc đàm phán tiếp Mã:hàm lambda không đóng tham số trong Python?
from pprint import pprint
li = []
for i in range(5):
li.append(lambda : pprint(i))
for k in li:
k()
năng suất:
4 4 4 4 4
tại sao không
0 1 2 3 4
??
Cảm ơn.
P.S. Nếu tôi viết trang trí hoàn chỉnh, nó hoạt động như mong đợi:
from pprint import pprint
li = []
#for i in range(5):
#li.append(lambda : pprint(i))
def closure(i):
def _func():
pprint(i)
return _func
for i in range(5):
li.append(closure(i))
for k in li:
k()
xem [câu hỏi này] (http://stackoverflow.com/q/2295290/195823) và [câu trả lời của tôi cho câu hỏi này] (http://stackoverflow.com/questions/2295290/what-do-lambda- function-closures-capture-in-python/2295372 # 2295372) –
Bạn có thể thấy đó là đóng biến bằng cách di chuyển vòng lặp ban đầu vào một hàm, và sau đó gọi hàm trước dòng 'for k in li:', vì vậy rằng 'i' không phải là tên hợp lệ trong phạm vi cấp mô-đun. Nó sẽ vẫn hoạt động (và nhận được kết quả tương tự vì nó đóng một tham chiếu không phải là giá trị), có nghĩa là tên được đóng lại. – agf
Cảm ơn tất cả các bạn.Tôi nghĩ rằng http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python/2295368#2295368 không chỉ giải thích mà còn lý do tại sao. Tôi nghĩ câu hỏi của tôi trùng lặp với http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python – Grissiom