【问题标题】:Accessing variable from enclosing scope in nested function从嵌套函数的封闭范围访问变量
【发布时间】:2012-04-28 22:35:53
【问题描述】:

我在另一个函数foo() 中嵌套了一个函数定义bar()。现在我正在尝试从嵌套函数bar() 访问位于外部函数foo() 中的变量。但是,由于范围规则,这不起作用(请参阅下面的错误回溯)。

我正在寻找类似于 global 关键字的东西,但它只能让我访问 global 变量,而这是某种 semi-global 变量.

下面是示例代码:

def foo():
    i = 0
    def bar():
        # how can I get access to the variable from enclosing scope?
        i += 1
    bar()

foo()

输出是:

$ python test.py
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    foo()
  File "test.py", line 5, in foo
    bar()
  File "test.py", line 4, in bar
    i += 1
UnboundLocalError: local variable 'i' referenced before assignment

【问题讨论】:

  • 你想达到什么目的?
  • 请说明这样做的原因。这将帮助我们提供更好的解决方案

标签: python scope closures


【解决方案1】:

这是您的解决方法:

class Test(object):
    def __init__(self):
        i = [0]
        def foo():
            i[0] += 1
        foo()
        print i[0]

t = Test()

这将是 nonlocal 关键字的用例,而不是 global,但这仅在 Python 3 中可用。

【讨论】:

  • +1 用于 Python 2.x 解决方法。令人惊讶的是,容器类型不受此影响。
  • 他们受到影响。在这里为您节省的是,范围规则确实允许 READ 访问。从技术上讲,你不写给 i,你写给 i[0]...
  • 有趣,找到this answer很好地解释了这一点。
【解决方案2】:

您需要nonlocal 语句而不是global

i 显然不是全局的,但它也不是foo 的本地。它是__init__ 的本地地址。因此,为了访问它,声明它nonlocal

不幸的是,nonlocal 仅是 python3。 你可以通过闭包来模拟它,但这会变得很丑。

【讨论】:

  • 显然 nonlocal 仅适用于 Python 3.x ,但这是一个很棒的搜索关键字。
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2017-04-21
  • 2013-05-03
  • 1970-01-01
  • 2015-07-02
相关资源
最近更新 更多