Tôi chỉ chạy ngang qua số Closing over the loop variable considered harmful của Eric Lippert qua SO, và sau khi thử nghiệm, nhận ra rằng cùng một vấn đề tồn tại (và thậm chí còn khó khăn hơn để có được) trong Python.Có cách nào Pythonic để đóng trên một biến vòng lặp?
>>> l = []
>>> for r in range(10):
... def foo():
... return r
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc
và, tiêu chuẩn C# workaround không làm việc (tôi giả sử vì bản chất của tài liệu tham khảo bằng Python)
>>> l = []
>>> for r in range(10):
... r2 = r
... def foo():
... return r2
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc
tôi nhận ra rằng đây là không nhiều của một vấn đề trong Python với nhấn mạnh chung của nó về cấu trúc đối tượng không đóng cửa, nhưng tôi tò mò nếu có một cách rõ ràng Pythonic để xử lý này, hoặc chúng ta phải đi đường JS của cuộc gọi chức năng lồng nhau để tạo ra các vars thực sự mới?
>>> l = []
>>> for r in range(10):
... l.append((lambda x: lambda: x)(r))
...
>>> for f in l:
... f()
...
0
1
2
# etc
Ồ, tôi thích mẹo đối số mặc định đó. Nhà máy chức năng đó có ngữ nghĩa tương tự như điều lambda đôi ở cuối mỏ. Tuy nhiên, các nhà máy Lambda là nguyên nhân dễ đọc. – quodlibetor