python - 函数内函数中的未绑定(bind)局部

标签 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

在我看来,在 banana 范围内定义的 x 应该对 apple 可用,就像在模块的级别可供该模块内的函数使用。

我环顾四周,看看我做错了什么,我的印象是我应该在 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

这是怎么回事?

最佳答案

“Global”表示模块的全局。您的 x 不是全局的;它是 banana 本地的,但不是 apple 的。

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

关于python - 函数内函数中的未绑定(bind)局部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32530465/

相关文章:

Python 列表理解与数据框循环

python - 如何在python中将标称数据转换为数值?

javascript jQuery 变量作用域

python - 为什么变量不能是全局的但函数却可以?

python - Python 中的 dict() 问题,TypeError :'tuple' 对象不可调用

python - 达到 max_clients 限制,请求排队 Tornado

ruby-on-rails - Rails : Why is with_exclusive_scope protected? 关于如何使用它有什么好的实践吗?

javascript - 如何制作全局.checked语句并调用它?

ios - 如果在其他类中实现,自定义点击识别器方法将不起作用

javascript - 如何在javascript中声明和初始化全局数组