我想知道以下Python代码的工作原理:
def sum(a, b):
return a+b+c
c=3
print sum(1,2)
# result: 6
我原本期望编译错误
当变量sum
不是时,我们如何定义c
函数(我会说c
不在sum函数的范围内)?
这就是他们所谓的闭包吗?
正如我所理解的那样,变量必须已经被“提及”,就像在下面的代码片段中那样(从this site复制)。这里x
已经在inc()
函数的定义之上提到了def makeInc(x):
def inc(y):
# x is "closed" in the definition of inc
return y + x
(尽管没有填写')。
{{1}}
答案 0 :(得分:6)
在这种情况下,在globals表中找到c
。如果您尝试调用sum(1,2)
并且在函数的作用域中找不到c
,或者它的父作用域(全局作用域),则会出现NameError异常。
虽然这类似于闭包,但访问函数体内的全局变量通常是不受欢迎的,因为它使调试变得更加困难。 python中一个命名闭包的更好例子(来自维基百科):
def outer():
y = 0
def inner():
nonlocal y
y += 1
return y
return inner
f = outer()
print(f(), f(), f()) #prints 1 2 3
有关更多详细信息,请参阅关于闭包的维基百科条目:Python example。
答案 1 :(得分:4)
如果在调用函数时未定义变量,Python将抛出错误
在定义Sum
时,请致电c
。
答案 2 :(得分:3)
Python在调用之前不会计算sum的主体。由于c是在调用sum之前定义的,因此可以使用sum。