python和javascript中的闭包之间的区别

use*_*722 8 javascript python closures

在JS中,我们可以编写如下的闭包:

function f(){
var a=0;
function g(){
    alert(a++);
}
return g;
}
g=f()
g()
Run Code Online (Sandbox Code Playgroud)

但是,如果我在python中编写以下代码

def f():
    a=0
    def g():
        a+=1
        print a
    return g
g=f()
g()
Run Code Online (Sandbox Code Playgroud)

然后我得到UnboundedLocalError.

谁能告诉我python和JS中的闭包之间的区别?

Mar*_*ota 9

a += 1在Python中使用时,它指的是g函数范围内的本地(未初始化)变量.基本上你可以从高端范围读取变量,但是如果你尝试编写变量,则会引用最近范围内的变量.为了让它像你想要的那样工作,你必须使用nonlocal仅存在Python 3的关键字.在Python 2中你不能这样做,除非你想要改变的变量是全局的,然后global关键字来了救援.

def f():
    a=0
    def g():
        nonlocal a
        a+=1
        print a
    return g
g=f()
g()
Run Code Online (Sandbox Code Playgroud)

  • 在Python 2中,`a = [0]`和`a [0] + = 1`使它工作.这是有效的,因为项目分配(以及成员和切片分配)不计入覆盖变量,而是改变对象的状态(在引擎盖下,您调用方法). (5认同)