函数内函数中的未绑定局部
Unbound local in a function within a function
我有以下代码(写在Python 2.X):
def banana(x):
def apple(stuff):
x /= 10
return stuff - x
return apple(11)
当我调用 banana
时,出现以下错误:
In [25]: import test
In [26]: test.banana(10)
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-26-313a8e4dfaff> in <module>()
----> 1 test.banana(10)
/home/dan/Science/dopa_net/test.py in banana(x)
3 x /= 10
4 return stuff - x
----> 5 return apple(11)
/home/dan/Science/dopa_net/test.py in apple(stuff)
1 def banana(x):
2 def apple(stuff):
----> 3 x /= 10
4 return stuff - x
5 return apple(11)
UnboundLocalError: local variable 'x' referenced before assignment
在我看来,在 banana
范围内定义的 x
应该对 apple
可用,就像在模块级别定义的常量可用一样在该模块中运行。
我环顾四周,看看我做错了什么,我的印象是我应该将 x
声明为 apple
中的 global
。然而,这对我来说也失败了:
In [27]: reload(test)
Out[27]: <module 'test' from 'test.py'>
In [28]: test.banana(10)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-28-313a8e4dfaff> in <module>()
----> 1 test.banana(10)
/home/dan/Science/dopa_net/test.py in banana(x)
4 x /= 10
5 return stuff - x
----> 6 return apple(11)
/home/dan/Science/dopa_net/test.py in apple(stuff)
2 def apple(stuff):
3 global x
----> 4 x /= 10
5 return stuff - x
6 return apple(11)
NameError: global name 'x' is not defined
这是怎么回事?
"Global" 对模块来说是全局的。您的 x
不是全局的;它是 banana
本地的,但不是 apple
.
本地的
在Python 3中,可以使用nonlocal x
使x
在apple
内可赋值。在 Python 2 中,无法从 apple
内部分配给 x
。您必须使用变通方法,例如使 x
成为可变对象并在 apple
.
中对其进行变异(而不是分配给它)
我有以下代码(写在Python 2.X):
def banana(x):
def apple(stuff):
x /= 10
return stuff - x
return apple(11)
当我调用 banana
时,出现以下错误:
In [25]: import test
In [26]: test.banana(10)
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-26-313a8e4dfaff> in <module>()
----> 1 test.banana(10)
/home/dan/Science/dopa_net/test.py in banana(x)
3 x /= 10
4 return stuff - x
----> 5 return apple(11)
/home/dan/Science/dopa_net/test.py in apple(stuff)
1 def banana(x):
2 def apple(stuff):
----> 3 x /= 10
4 return stuff - x
5 return apple(11)
UnboundLocalError: local variable 'x' referenced before assignment
在我看来,在 banana
范围内定义的 x
应该对 apple
可用,就像在模块级别定义的常量可用一样在该模块中运行。
我环顾四周,看看我做错了什么,我的印象是我应该将 x
声明为 apple
中的 global
。然而,这对我来说也失败了:
In [27]: reload(test)
Out[27]: <module 'test' from 'test.py'>
In [28]: test.banana(10)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-28-313a8e4dfaff> in <module>()
----> 1 test.banana(10)
/home/dan/Science/dopa_net/test.py in banana(x)
4 x /= 10
5 return stuff - x
----> 6 return apple(11)
/home/dan/Science/dopa_net/test.py in apple(stuff)
2 def apple(stuff):
3 global x
----> 4 x /= 10
5 return stuff - x
6 return apple(11)
NameError: global name 'x' is not defined
这是怎么回事?
"Global" 对模块来说是全局的。您的 x
不是全局的;它是 banana
本地的,但不是 apple
.
在Python 3中,可以使用nonlocal x
使x
在apple
内可赋值。在 Python 2 中,无法从 apple
内部分配给 x
。您必须使用变通方法,例如使 x
成为可变对象并在 apple
.