Tôi muốn có một danh sách các lambdas hoạt động như sắp xếp của một bộ nhớ cache để một số tính toán nặng và nhận thấy điều này:Lambdas danh sách bên comprehensions
>>> [j() for j in [lambda:i for i in range(10)]]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Mặc dù
>>> list([lambda:i for i in range(10)])
[<function <lambda> at 0xb6f9d1ec>, <function <lambda> at 0xb6f9d22c>, <function <lambda> at 0xb6f9d26c>, <function <lambda> at 0xb6f9d2ac>, <function <lambda> at 0xb6f9d2ec>, <function <lambda> at 0xb6f9d32c>, <function <lambda> at 0xb6f9d36c>, <function <lambda> at 0xb6f9d3ac>, <function <lambda> at 0xb6f9d3ec>, <function <lambda> at 0xb6f9d42c>]
Ý nghĩa rằng lambdas là các hàm duy nhất nhưng tất cả chúng đều chia sẻ cùng một giá trị chỉ mục.
Đây có phải là một lỗi hoặc một tính năng? Làm cách nào để tránh sự cố này? Nó không giới hạn comprehensions danh sách ...
>>> funcs = []
... for i in range(10):
... funcs.append(lambda:i)
... [j() for j in funcs]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Cách tiếp cận đầu tiên không hoạt động tốt khi bạn muốn 'lambda' hỗ trợ' * args'. Cách tiếp cận thứ hai sẽ hoạt động ở đó, nhưng ... làm việc nhiều hơn :) –
Quá tệ Tôi không thể đưa dấu màu xanh lục cho cả hai câu trả lời. Tôi đã chọn điều này vì nó thực sự đã đưa ra mã chính xác để cắt & dán như tôi năm và tôi thích cách tiếp cận đó để trả lời trên SO. – ubershmekel
Đối với những người trong chúng ta ít giỏi về Python, bất kỳ cơ hội nào bạn có thể sử dụng một biến khác với 'i' cho một trong các cá thể trong phương pháp đầu tiên? – Chowlett