python中使用闭包及修改外部函数的局部变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中使用闭包及修改外部函数的局部变量相关的知识,希望对你有一定的参考价值。

参考技术A

在python中,函数可以被嵌套定义,也就是说,函数中可以定义函数。该函数还可以将其内部定义的函数作为返回值返回。

闭包的定义:一般来说,我们可以认为,如果一个函数可以读取其他函数中的局部变量,那么它们就构成了闭包。

注意 :闭包的定义不是特别清晰,但大体上的意思是这样的。

我们知道,普通的函数是可以使用全局变量的

类似的,函数中定义的函数,也是可以使用外部函数的变量的。因此,满足了函数读取了其他函数局部变量的这一条件,他们因此构成了闭包。

在闭包的使用中,我们可以先给外部的函数赋予不同的局部变量,然后再调用其中内部的函数时,就可以读取到这些不同的局部变量了。

外部变量的使用 在普通函数中,虽然可以直接使用全局变量,但是不可以直接修改全局变量。从变量的作用域来说,一旦你尝试修改全局变量,那么就会尝试创建并使用一个同名的局部变量。因此,如果你需要在普通函数中修改全局变量,需要使用global

同样的,如果你希望通过定义在内部的函数去修改其外部函数的变量,那么必须使用nonlocal

关于闭包的理解

闭包官方定义:闭包是指程序中有许多变量和绑定变量的执行环境。

本人自己理解:程序的代码段允许存在一级函数并且一级函数不能被释放,一级函数没有释放之前,外部可以使用一级函数的局部变量。

进一步理解 : 闭包就是外部可以使用局部变量。

闭包的功能:1、外部可以使用局部变量。
      2、使函数不能释放。
闭包的缺点:外部会修改局部变量,会大量占用内存,内存不会被释放。

为什么一级函数不能被释放?
答:因为一级函数中有一个函数,这个函数使用了一级函数的变量,我们返回了这个函数并创建一个变量接收了。那么这个函数就不会被js的垃圾回收机制销毁。

最常用的一种形式是函数作为返回值被返回

var F = function(){
    var b = local;
    var N = function(){
        return b;
    }
    return N;
}
console.log(F()());

一种变形的形式是将内部函数赋值给一个外部变量

var inner;
var F = function(){
    var b = local;
    var N = function(){
        return b;
    };
    inner = N;
};
F();
console.log(inner());

闭包可以通过函数参数传递函数的形式来实现

var Inner = function(fn){
    console.log(fn());
}
var F = function(){
    var b = local;
    var N = function(){
        return b;
    }
    Inner(N);
}
F();

我们通过提供getter()和setter()函数来将要操作的变量保存在函数内部,防止其暴露在外部

var getValue,setValue;
(function(){
    var secret = 0;
    getValue = function(){
        return secret;
    }
    setValue = function(v){
        if(typeof v === number){
            secret = v;
        }
    }
})();
console.log(getValue());//0
setValue(1);
console.log(getValue());//1

使用闭包可以很方便的实现一个迭代器

function setup(x){
    var i = 0;
    return function(){
        return x[i++];
    }
}
var next = setup([a,b,c]);
console.log(next());//‘a‘
console.log(next());//‘b‘
console.log(next());//‘c‘

谢谢大家

以上是关于python中使用闭包及修改外部函数的局部变量的主要内容,如果未能解决你的问题,请参考以下文章

Python嵌套函数和闭包

python闭包

Python—闭包

前端面试基本---闭包大透析(包含案例及题目)

Python开发基础-Day7-闭包函数和装饰器基础

Python函数编程——闭包和装饰器