这是我的代码:
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 + 1”的左侧吗?
由于
答案 0 :(得分:5)
您正确理解它。您不能在Python 2的嵌套范围中使用x
进行分配。
在Python 3中,您仍然可以将变量标记为nonlocal
,将其用作绑定事件。这是仅为此用例引入的关键字:
def f(x):
def g(n):
nonlocal x
if n < 10:
x = x + 1
g(n + 1)
g(0)
在python 2中,你有一些解决方法;使用mutable来避免需要绑定它,或者(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)
答案 1 :(得分:0)
是的,分配名称与阅读其值不同。除非您另行指定,否则在函数中分配的任何名称都将被视为该函数的局部变量。
在Python 2中,“另外指定”的唯一方法是使用global
语句来分配全局变量。在Python 3中,您还可以使用nonlocal
语句为更高(但不一定是全局)范围内的变量赋值。
在您的示例中,x
位于更高但非全局的范围内(函数f
)。因此,无法在Python 2中x
内分配g
。在Python 3中,您可以使用nonlocal x
中的g
语句执行此操作。