【问题标题】:Unbound local in a function within a function函数内函数中的未绑定本地
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 或者在apple的定义中加入x=x
  • 好的,所以,有了python 2,我可以在苹果内部使用 x;我只是不能 assign 给它。这对我有用。
  • @jonrsharpe:这将让您分配给名为 x 的东西,但您的分配不会影响封闭函数中的 x
  • @BrenBarn 没错,这取决于实际目标是什么
猜你喜欢
  • 1970-01-01
  • 2021-06-15
  • 2012-09-18
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
相关资源
最近更新 更多