Điều này xảy ra vì method_1
có phạm vi địa phương riêng của nó, nơi có thể khai báo biến. Python thấy value = True
và cho rằng bạn đang tạo biến mới có tên value
, địa phương là method_1
.
Lý do Python làm điều này là để tránh gây ô nhiễm cho người dân địa phương của phạm vi bên ngoài với các biến từ một hàm bên trong. (Bạn sẽ không muốn các bài tập ở các hàm bình thường, mô-đun cấp để tạo ra các biến toàn cục được tạo ra!)
Nếu bạn không gán cho value
, thì Python sẽ tìm kiếm các phạm vi bên ngoài tìm biến đó (để đọc biến hoạt động như mong đợi, như được minh họa bởi số method_2
) của bạn.
Một cách để làm được việc này là bằng cách sử dụng một đối tượng có thể thay đổi thay vì assigment:
result = { 'value': False }
def method_1():
result['value'] = True
Trong Python 3, nonlocal
statement (xem thêm docs) đã được bổ sung cho chính xác kịch bản này:
def method_1():
nonlocal value
value = True # Works as expected -- assigns to `value` from outer scope
Chuỗi này là một ví dụ hoàn hảo về lý do tại sao năm phút chỉnh sửa miễn phí đôi khi không tốt. – agf
@agf: Tại sao nó xấu? – Cameron