我想知道封闭函数是如何工作的,我运行三个代码块,如下所示。
区块1
def a1_(r):
r+=1
res = 0
print('a1_res=',id(res))
def a2(r):
global res
print('res = ',res)
print('a2_res=',id(res))
res+=r
return res
return a2(r)
a1_(1)它不能工作,错误是NameError:未定义名称'res‘,发生在第6行。
区块2
def foo():
a = 1
def foo2():
global a
print(a)
a+=1
return a
return foo2()
foo()这是没有任何错误的工作。
块3
我把第一座中的“全局”改为“非本地”,它有效!
def a1_(r):
r+=1
res = 0
print('a1_res=',id(res))
def a2(r):
nonlocal res
print('res = ',res)
print('a2_res=',id(res))
res+=r
return res
return a2(r)
a1_(1)只是觉得很困惑,因为块1和块2的结构是相似的。然而,第2项有效,但第1项无效。
此外,在第3块中,我将“全局”替换为“非本地”,它起作用。(PS:在我看来,全局和非局部的效果是一样的)
有人能帮我弄清楚吗?非常感谢!
发布于 2022-06-13 14:37:34
据我所知,第2块不应该也起作用,至少对我不起作用。可以使用print(globals())查看全局命名空间中的哪些变量。
对于块1和块2,您尝试访问全局命名空间中的一个变量,只有在该命名空间中定义该变量时,该变量才能工作。
对于块3,您正在使用非本地的方式访问外部命名空间中的变量。如果您在搜索工程中搜索python名称空间,您可能会更多地了解您正在调查的内容(例如这或这)。
编辑:NameError: name 'res' is not defined告诉您,这个变量没有在相关的命名空间中定义。调用global res告诉Python,即使res不是以前在全局命名空间中定义的,但是在使用它之前需要定义它,因此导致错误的行应该是print('res = ', res),因为在这里res不是在全局命名空间中定义的。
https://stackoverflow.com/questions/72604397
复制相似问题