Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是Python闭包吗?(或者,为什么该代码有效?)_Python_Closures - Fatal编程技术网

这是Python闭包吗?(或者,为什么该代码有效?)

这是Python闭包吗?(或者,为什么该代码有效?),python,closures,Python,Closures,我想知道为什么以下Python代码可以工作: def sum(a, b): return a+b+c c=3 print sum(1,2) # result: 6 我原以为会出现编译错误。 当变量c不在sum函数的范围内时,如何定义sum函数 这就是他们所说的结束吗 正如我对闭包的理解,变量必须已经“提到”,就像下面的代码片段(从中复制的)一样。在这里,inc()函数的定义上面已经提到了x(虽然没有“填充”) def makeInc(x): def inc(y): # x

我想知道为什么以下Python代码可以工作:

def sum(a, b):
    return a+b+c
c=3
print sum(1,2)
# result: 6
我原以为会出现编译错误。
当变量
c
不在sum函数的范围内时,如何定义
sum
函数

这就是他们所说的结束吗

正如我对闭包的理解,变量必须已经“提到”,就像下面的代码片段(从中复制的)一样。在这里,
inc()
函数的定义上面已经提到了
x
(虽然没有“填充”)

def makeInc(x):
  def inc(y):
     # x is "closed" in the definition of inc
     return y + x

如果调用函数时未定义变量,Python将抛出错误。

当定义了
c
时,调用
Sum

在这种情况下,可以在全局表中找到
c
。如果您尝试调用
sum(1,2)
并且在函数的作用域或其父作用域(全局作用域)中找不到
c
,那么您将得到一个NameError异常

虽然这类似于闭包,但通常不赞成在函数体中访问全局变量,因为这会使调试更加困难。python中命名闭包的更好示例(来自Wikipedia):


有关更多详细信息,请参阅Wikipedia中关于闭包的条目:。

Python在调用sum之前不会计算sum的主体。因为c是在调用sum之前定义的,所以sum可以使用它。

@BoltClock:不太可能
sum()
不带任何作用域。这不是一个闭包。这只是python作用域的工作原理。它可能有助于理解编译时和运行时之间的差异。当它引用全局变量时,我怀疑它是一个闭包。你应该寻找“名称空间”的概念,而这并不是一个闭包。奇怪的是,如果
y=0
在定义之后出现,那么
internal
就起作用了。Omnifarious:没那么奇怪。Python作用域是可变的。Python使用一个2过程编译器——它在第一个过程中看到外部定义,所以它知道如何在第二个过程中连接它。但是,如果您试图在定义
y
之前调用内部函数,则会出现异常。我认为不是这样。正如前面所说:这就是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