Tôi có một mã đơn giản sau đây:Weird hành vi đóng cửa trong python
def get():
return [lambda: i for i in [1, 2, 3]]
for f in get():
print(f())
Đúng như dự đoán từ kiến thức python của tôi, đầu ra là 3 - danh sách toàn bộ sẽ chứa giá trị cuối cùng của i
. Nhưng làm thế nào điều này hoạt động nội bộ?
AFAIK, biến python chỉ đơn giản là tham chiếu đến đối tượng, vì vậy đóng cửa đầu tiên phải kèm theo đối tượng đầu tiên i
tham chiếu - và đối tượng này chắc chắn là 1, không phải 3 O_O. Làm thế nào nó xảy ra rằng đóng cửa python bao quanh biến thay vì đối tượng tham chiếu biến này? Liệu nó có lưu tên biến là văn bản thuần túy, một số "tham chiếu đến biến" hay không?
Có một số thông tin bổ sung có sẵn về chủ đề này để tôi có thể xem các biến ẩn được sử dụng để "tiết kiệm" phạm vi, truy cập, v.v ... không? – grigoryvp
'(lambda x: lambda: x) (i)' là một trong những điều xấu nhất mà tôi đã thấy trong Python. Ick. (Không phải câu trả lời của bạn là sai hay xấu, mỗi lần, chỉ cần nói - thật khó đọc). –
@EyeofHell: Tôi nghĩ [pep-227] (http://www.python.org/dev/peps/pep-0227/) là tài liệu chuẩn về quy tắc phạm vi python. Ngoài ra, có một số câu trả lời hay về điều này ở đây trên SO, ví dụ: [ở đây] (http://stackoverflow.com/questions/291978/short-description-of-python-scoping-rules) – georg