首先,不止python有闭包,所有有函数作用域的语言都有闭包。闭包只是对函数作用域的运用。
一个变量x(x代表任何),加一个引用这个变量x的函数就是一个闭包。之所以很多闭包表现形式是:把这个变量x和引用变量x的函数用一个外部函数包起来,然后return出去,并且立即调用。我给你解释这么做的原因。
用外部函数包裹住变量x与引用变量x的函数,只是为了创造一个局部变量。不用函数包裹的话,该变量就成为了全局变量,无法实现闭包的唯一目的——隐藏变量。闭包英文名是clouser,并没有包的意思,只是中文这么翻译。之所以隐藏变量,举个例子。我们做一款游戏,初始值有30条命。如果在是全局变量,有人不小心修改了30,这并不是我们想要的结果。我们可以把30条命隐藏在闭包里。别人想改变命的时候,可以调用我们在闭包中给他设定好的修改函数。没有人可以改30这个初始值,我们就达到了闭包的目的,隐藏变量,并给别人一种我们设定好的方式来修改我们的变量。
这就是闭包了,在所有有局部作用域的语言中都是这个道理。可以说闭包是函数作用域的副作用。
很多时候,有些难以理解的概念道理其实很简单。别被人绕晕了。