一个函数返回另一个函数.为什么里面的函数可以从父对象确定列表的范围,而不能确定常量的范围



考虑这个函数:

def g():
x = []

def f():
x.append([0])
print(x)
pass
return f

称之为:

test = g()
test()

我得到以下输出:

Out: [[0]]

我们可以重新初始化测试函数并多次调用它:

test = g()
for i in range(3):
test()

产生以下输出:

Out: [[0]]
[[0], [0]]
[[0], [0], [0]]

但是,定义以下功能:

def j():
x = 1
def f():
x += 1
print(x)
pass
return f

并称之为:

test = j()
test()

导致错误:

UnboundLocalError: local variable 'x' referenced before assignment

列表似乎在内部函数范围内,而值不在。为什么会发生这种情况?

@rassar清楚地解释了原因。这里我给出一个解决方案:

def j():
x = 1
def f():
nonlocal x
x += 1
print(x)
pass
return f

其实这不是一个简单的问题。即使+=看起来像一个有界方法调用,也是一个就地操作(如果您有其他语言的经验(。但运行的是类似于x = x.__add__(1)x = x.__iadd__(1)的东西。所以这是一项任务。

这是因为j使用赋值表达式,而g使用方法调用。请记住,x += 1等效于x = x + 1。如果将g更改为:
def g():
x = []
def f():
x += [[0]]
print(x)
pass
return f

你得到:

>>> test = g()
>>> test()
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
test()
File "<pyshell#18>", line 5, in f
x += [[0]]
UnboundLocalError: local variable 'x' referenced before assignment

因为,python编译器知道函数f中的变量'x'是一个局部变量,而不是函数j中的变量。所以发生了上面提到的错误。

所以你应该使用非本地。请参阅下面的链接。访问父函数';使用python 在父函数中调用的子函数中的s变量

相关内容

  • 没有找到相关文章

最新更新