在函数内的函数中取消绑定本地

时间:2015-09-11 19:03:41

标签: python scope global local python-2.x

我有以下代码(用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,就像在模块级别定义的常量一样可用于该模块中的功能。

我环顾四周,看看我做错了什么,我觉得我应该在x内宣布globalapple。然而,这对我来说也是失败的:

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

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

“全球”意味着模块的全球性。您的x不是全球性的;它位于banana的本地,但不是apple

在Python 3中,您可以使用nonlocal xx内分配apple。在Python 2中,无法从x内部分配apple。您必须使用一种解决方法,例如将x变为可变对象并在apple中对其进行变更(而不是分配给它)。