分配给函数 Arg 时出现未绑定的本地错误
Unbound Local Error when Assigning to Function Arg
def make_accumulator(init):
def accumulate(part):
init = init + part
return init
return accumulate
A = make_accumulator(1)
print A(2)
给我:-
Traceback (most recent call last):
File "make-accumulator.py", line 8, in <module>
print A(2)
File "make-accumulator.py", line 3, in accumulate
init = init + part
UnboundLocalError: local variable 'init' referenced before assignment
为什么init在accumulate里面不可见?
那是因为在解析内部函数时,当 Python 看到赋值 init = init + part
它认为 init
是一个局部变量,它只会在局部范围内寻找它,当函数实际上被调用了。
要修复它,请将 init
作为参数添加到 accumulate
,默认值为 init
:
def make_accumulator(init):
def accumulate(part, init=init):
init = init + part
return init
return accumulate
阅读:Why am I getting an UnboundLocalError when the variable has a value?
>>> def make_accumulator(init):
... def accumulate(part):
... return init + part
... return accumulate
...
>>> make_accumulator(1)
<function accumulate at 0x7fe3ec398938>
>>> A(2)
3
由于您在 accumulate 中声明了 init
,Python 将其解释为局部的,因此在赋值之前被引用。 (请注意,我删除了 init =
部分)。
我绝对不是这方面的专家,但从这些帖子中得到了提示:Here and Here。
我想有人可以更好地解释它...
def make_accumulator(init):
def accumulate(part):
init = init + part
return init
return accumulate
A = make_accumulator(1)
print A(2)
给我:-
Traceback (most recent call last):
File "make-accumulator.py", line 8, in <module>
print A(2)
File "make-accumulator.py", line 3, in accumulate
init = init + part
UnboundLocalError: local variable 'init' referenced before assignment
为什么init在accumulate里面不可见?
那是因为在解析内部函数时,当 Python 看到赋值 init = init + part
它认为 init
是一个局部变量,它只会在局部范围内寻找它,当函数实际上被调用了。
要修复它,请将 init
作为参数添加到 accumulate
,默认值为 init
:
def make_accumulator(init):
def accumulate(part, init=init):
init = init + part
return init
return accumulate
阅读:Why am I getting an UnboundLocalError when the variable has a value?
>>> def make_accumulator(init):
... def accumulate(part):
... return init + part
... return accumulate
...
>>> make_accumulator(1)
<function accumulate at 0x7fe3ec398938>
>>> A(2)
3
由于您在 accumulate 中声明了 init
,Python 将其解释为局部的,因此在赋值之前被引用。 (请注意,我删除了 init =
部分)。
我绝对不是这方面的专家,但从这些帖子中得到了提示:Here and Here。
我想有人可以更好地解释它...