3

这是我的代码:

def f(x):
    def g(n):
        if n < 10:
            x = x + 1
            g(n + 1)
    g(0)

当我评估 f(0) 时,会出现错误“x 在赋值之前引用”。

但是,当我使用 "print x" 而不是 "x = x + 1" 时,它会起作用。

似乎在 g 的范围内,我只能将 x 用作“使用事件”而不是“绑定事件”。我想问题是 f 只传递给 g x 的值。

我理解正确与否?如果不是,有人可以解释为什么“x = x + 1”的左侧在引用之前没有定义吗?

谢谢

4

2 回答 2

5

你理解正确。在 Python 2 的嵌套范围内,您不能使用xto 赋值。

nonlocal在 Python 3 中,您仍然可以通过将变量标记为;来将其用作绑定事件。这是为此用例引入的关键字:

def f(x):
    def g(n):
        nonlocal x
        if n < 10:
            x = x + 1
            g(n + 1)
    g(0)

在 python 2 中,你有一些变通方法;使用可变的以避免需要绑定它,或(ab)使用函数属性:

def f(x):
    x = [x]   # lists are mutable
    def g(n):
        if n < 10:
            x[0] = x[0] + 1   # not assigning, but mutating (x.__setitem__(0, newvalue))
            g(n + 1)
    g(0)

或者

def f(x):
    def g(n):
        if n < 10:
            g.x = g.x + 1
            g(n + 1)
    g.x = x  # attribute on the function!
    g(0)
于 2013-02-03T23:08:42.333 回答
1

是的,分配名称与读取它们的值不同。除非您另外指定,否则在函数中分配的任何名称都被视为该函数的局部变量。

在 Python 2 中,“指定其他方式”的唯一方法是使用一条global语句来允许您分配给全局变量。在 Python 3 中,您还可以使用nonlocal语句为更高(但不一定是全局)范围内的变量赋值。

在您的示例中,x位于更高但非全局范围内(函数f)。因此,在 Python 2 中无法x从内部进行分配g。在 Python 3 中,您可以nonlocal x使用g.

于 2013-02-03T23:09:14.617 回答