2011-07-03 24 views
9

Tôi tự hỏi liệu có thể đóng cửa bằng Python để thao tác các biến trong không gian tên của nó hay không. Bạn có thể gọi các tác dụng phụ này bởi vì trạng thái đang được thay đổi bên ngoài chính bản thân nó. Tôi muốn làm điều gì đó như thế nàyĐóng cửa Python với các hiệu ứng phụ

def closureMaker(): 
    x = 0 
    def closure(): 
    x+=1 
    print x 
    return closure 

a = closureMaker() 
a() 
1 
a() 
2 

Rõ ràng điều tôi hy vọng làm là phức tạp hơn, nhưng ví dụ này minh họa những gì tôi đang nói đến.

+0

tôi muốn đánh dấu đây là một bản sao của các câu hỏi khác, ngoại trừ những câu hỏi khác thực sự nên được đánh dấu là một bản sao của một trong này; câu hỏi này khá đơn giản và có ý nghĩa và được viết tốt. Nhưng cũng thấy http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to-language-x-closures – ninjagecko

+0

Vì vậy, không có cách nào để hợp nhất hai hoặc nhiều câu hỏi? ; p –

Trả lời

17

Bạn không thể làm chính xác điều đó trong Python 2.x, nhưng bạn có thể sử dụng một mẹo để có được cùng một hiệu ứng: sử dụng một đối tượng có thể thay đổi như danh sách.

def closureMaker(): 
    x = [0] 
    def closure(): 
     x[0] += 1 
     print x[0] 
    return closure 

Bạn cũng có thể tạo x đối tượng có thuộc tính được đặt tên hoặc từ điển. Điều này có thể dễ đọc hơn một danh sách, đặc biệt nếu bạn có nhiều hơn một biến để sửa đổi.

Trong Python 3.x, bạn chỉ cần thêm nonlocal x vào hàm bên trong của mình. Điều này gây ra các bài tập cho x để chuyển đến phạm vi bên ngoài.

+0

Vui lòng giải thích lý do tại sao? Tôi đang cố gắng tìm một cái gì đó về điều này trong tài liệu python. –

+1

@ André: PEP 3104 là thông tin, nếu kỹ thuật: http://www.python.org/dev/peps/pep-3104/ –

+0

Với tôi, có vẻ như nó ** nên ** hoạt động theo một trong hai cách. Tôi chỉ đọc [this] (http://docs.python.org/reference/executionmodel.html#naming-and-binding): * "Nếu định nghĩa xảy ra trong một khối chức năng, phạm vi mở rộng đến bất kỳ khối nào chứa trong xác định một, trừ khi một khối chứa giới thiệu một ràng buộc khác nhau cho tên. "* –

Các vấn đề liên quan