0

这是一个示例代码:

def foo():
    def bar():
        foobar = 'foobaz'

    foobar = 'foobar'
    print foobar
    bar()
    print foobar

foo()

我想通过函数更改变量foobar内部。上面的代码将不起作用,因为inside与 in位于单独的命名空间中。一个简单的解决方法是制作一个全局的,并且两者都具有并且可以访问它,但我希望会有更简单的解决方法。foobarfoobarbarfoobarfoofoobarfoobar

4

5 回答 5

2

在 python 3.x 上,您可以使用nonlocal,对于 python 2.x,请尝试使用函数属性:

def foo():
    def bar():
        foo.foobar = 'foobaz'  #change the function attribute

    foo.foobar = 'foobar'     #declare as function attribute
    print foo.foobar
    bar()
    print foo.foobar
foo() 

输出:

foobar
foobaz
于 2012-11-03T19:51:37.753 回答
2

您正在寻找nonlocal3.x 中存在的关键字。

def f():
    x = None
    def g():
        nonlocal x
        x = 1

如果您被困在 2.x 中,您可以通过拥有一个列表或类似的可变数据容器并访问它作为解决方法来做到这一点。

def f():
    x = [None]
    def g():
        x[0] = 1

这适用于变量确实属于范围,但不会超出范围。使用可变对象,我们可以在范围内更改它们,并且这些更改会传播出去。

于 2012-11-03T19:43:24.520 回答
1

在 python 2.7 中不可能。在python 3中:

def foo():
    def bar():
        nonlocal foobar
        foobar = 'foobaz'

    foobar = 'foobar'
    print foobar
    bar()
    print foobar

foo()

在 2.x 中,您可以执行以下操作:

def foo():
    foobar = []
    def bar():
        foobar[0] = 'foobaz'

    foobar[0] = 'foobar'
    print foobar[0]
    bar()
    print foobar[0]

foo()
于 2012-11-03T19:43:39.410 回答
0

即使函数已经是 Python 中的一等对象,您也可以创建自己的“仿函数”或函数对象,如下所示:

class Foo(object):
    def bar(self):
        self.foobar = 'foobaz'

    def __call__(self):
        self.foobar = 'foobar'
        print self.foobar
        self.bar()
        print self.foobar

foo = Foo()
foo()
于 2012-11-03T20:53:32.660 回答
0
def foo():
    def bar():
        foobar = 'foobaz'
        return foobar

    foobar = 'foobar'
    print foobar
    foobar = bar()
    print foobar

foo()
于 2012-11-03T19:45:52.760 回答