我刚刚学习了python@decorator,很酷,但是很快我发现我修改后的代码出现了奇怪的问题。
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()
我调试它,它在 print param1 抛出异常
UnboundLocalError: local variable 'param1' referenced before assignment
如果我删除 param1 = 'new'
此行,而不对外部范围的变量进行任何修改操作(链接到新对象),则此例程可能会起作用。
这是否意味着我只复制了一份外部范围变量,然后进行修改?
谢谢德尔南,关闭是必不可少的。可能来自这里的答案: 与语言 X 闭包相比,Python 中的闭包有哪些限制?
类似的代码如下:
def e(a):
def f():
print a
a = '1'
f()
e('2')
而且这似乎是以前烦人的全局变量:
a = '1'
def b():
#global a
print a
a = '2'
b()
这是通过添加全局符号修复的。但是对于关闭,没有找到这样的符号。感谢 unutbu,Python 3 给了我们nonlocal。
我从上面知道直接访问外部变量是只读的。但是看到之前的读取变量(print var)也受到影响,这有点不舒服。