我刚学Python的装饰器,感觉很酷,但很快我发现我的修改后的代码出现了奇怪的问题。
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()
我调试它时,在打印param1时抛出异常。
UnboundLocalError: local variable 'param1' referenced before assignment
如果我删除这一行 param1 = 'new'
,并且没有对外部作用域变量进行任何修改操作(链接到新对象),那么这个程序可能会正常工作。这是否意味着我只复制了外部作用域变量的一个副本,然后进行了修改?
感谢 Delnan,这是闭包的关键。 可能的答案在这里: Python中闭包与语言X闭包相比有哪些限制? 类似的代码如下:
def e(a):
def f():
print a
a = '1'
f()
e('2')
而且这似乎是以前让人烦恼的全局变量:
a = '1'
def b():
#global a
print a
a = '2'
b()
通过添加global符号可以解决这个问题。但是对于闭包,没有这样的符号。感谢unutbu,Python 3 给了我们nonlocal。
我知道从上面所述直接访问外部变量是只读的。但是在使用preceded(先前)读取变量(print var)时也受到影响,这种情况有些令人不舒服。
param3 = new
...fn(param3)
呢? - detly