【发布时间】:2015-09-11 19:03:40
【问题描述】:
我有以下代码(用 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
在我看来,x,定义在banana 的范围内,应该对apple 可用,就像在模块级别定义的常量可用于该模块内的函数一样。
我在 SO 上环顾四周,看看我做错了什么,我的印象是我应该在 apple 中将 x 声明为 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
这是怎么回事?
【问题讨论】:
-
闭包中的变量算作非本地变量;试试
nonlocal x。 -
@jonrsharpe 忘了提到我在 python 2.X 上。
-
啊,除非你这样做,否则你无法访问它,例如
def apple(stuff, x=x):
标签: python scope global local python-2.x