Tôi vừa mới học python @ decorator, nó rất tuyệt, nhưng chẳng mấy chốc tôi tìm thấy mã đã sửa đổi của mình phát ra những vấn đề lạ.Chức năng đóng của Python mất quyền truy cập biến ngoài
def with_wrapper(param1):
def dummy_wrapper(fn):
print param1
param1 = 'new'
fn(param1)
return dummy_wrapper
def dummy():
@with_wrapper('param1')
def implementation(param2):
print param2
dummy()
tôi gỡ lỗi nó, nó ném ra ngoại lệ tại in param1
UnboundLocalError: local variable 'param1' referenced before assignment
Nếu tôi loại bỏ param1 = 'new'
dòng này, mà không cần bất kỳ hoạt động sửa đổi (liên kết đến đối tượng mới) trên biến từ phạm vi bên ngoài, thói quen này có thể làm việc.
Có phải là tôi chỉ tạo một bản sao của các biến phạm vi bên ngoài, sau đó sửa đổi?
Cảm ơn Delnan, cần thiết phải đóng cửa. câu trả lời có khả năng từ đây: What limitations have closures in Python compared to language X closures?
đang tương tự như:
def e(a):
def f():
print a
a = '1'
f()
e('2')
Và cũng điều này dường như biến toàn cầu gây phiền nhiễu trước:
a = '1'
def b():
#global a
print a
a = '2'
b()
này được cố định bằng cách thêm biểu tượng toàn cầu. Nhưng để đóng cửa, không tìm thấy biểu tượng nào. Cảm ơn unutbu, Python 3 đã cho chúng tôi nonlocal.
Tôi biết từ trên trực tiếp truy cập vào biến bên ngoài là chỉ đọc. nhưng không thoải mái khi thấy biến đọc trước (print var) cũng bị ảnh hưởng.
thể trùng lặp của [gì hạn chế có đóng cửa trong Python so với ngôn ngữ X đóng cửa?] (http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to-language-x-closures) – delnan
Điều này đã hoàn toàn không có gì để làm với trang trí btw. – delnan
Có, điều này xảy ra trong bao đóng. như thế này: def e (a): def f(): in một a = '1' f() e ('123') –