Các mã sau spits ra 1
hai lần, tôi mong đợi để xem 0
và sau đó 1
Python lambda của ràng buộc với các giá trị địa phương
def pv(v) :
print v
def test() :
value = []
value.append(0)
value.append(1)
x=[]
for v in value :
x.append(lambda : pv(v))
return x
x = test()
for xx in x:
xx()
tôi mong đợi lambdas python để ràng buộc vào tham khảo một biến địa phương được trỏ đến, đằng sau bối cảnh. Tuy nhiên điều đó dường như không đúng. Tôi đã gặp phải vấn đề này trong một hệ thống lớn, nơi lambda đang làm equavalent C++ hiện đại của một ràng buộc ('boost :: bind' chẳng hạn) trong trường hợp này bạn sẽ liên kết với một ptr thông minh hoặc bản sao contstruct một bản sao cho lambda.
Vì vậy, làm cách nào để liên kết biến cục bộ với hàm lambda và nó giữ nguyên tham chiếu chính xác khi được sử dụng? Tôi khá gobsmacked với hành vi vì tôi sẽ không mong đợi điều này từ một ngôn ngữ với một bộ thu rác.
Mã trong câu hỏi trông như sau (l3_e là biến mà gây ra vấn đề):
for category in cat :
for l2 in cat[category].entries :
for l3 in cat[category].entries[l2].entry["sub_entries"] :
l3_e = cat[category].entries[l2].entry["sub_entries"][l3]
url = "http://forums.heroesofnewerth.com/" + l3_e.entry["url"]
self.l4_processing_status[l3_e] = 0
l3_discovery_requests.append(Request(
url, callback = lambda response : self.parse_l4(response,l3_e)))
print l3_e.entry["url"]
return l3_discovery_requests
Tôi đã nhìn thấy một số biến thể của câu hỏi này. ai đó cần tổng hợp tất cả, thay đổi tiêu đề thành nội dung đáng nhớ và sau đó thông báo cho google biết rằng – Shep
ah, thông tin cho bạn, gần trùng lặp: [lexical-closures-in-python] (http://stackoverflow.com/q/233673/915501) – Shep
Ngoài ra, đoạn mã đầu tiên minh họa điểm của bạn một cách hoàn hảo, tại sao lại dán vào đoạn thứ hai này? – Shep