闭包Python报错<function counter.<locals>.incr at 0x03003660>

来源:互联网 发布:中国网络诗歌网高研班 编辑:程序博客网 时间:2024/06/14 01:12

如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。(简单说这个外部作用域的变量就是自由变量)


闭包将内部函数自己的代码和作用域以及外部函数的作用域结合起来。

闭包的词法变量不属于全局名称空间域或者局部的------而属于其他的名称空间,带着“流浪”的作用域。



>>> def make_addr(assend):
    def adder(gugend):
        return assend+gugend
    return adder

>>> p=make_addr(23)
>>> q=mkde_addr(44)

>>> print(p(100))
123
>>> print(q(100))
144

分析一下:

我们发现,make_adder是一个函数,包括一个参数assend,比较特殊的地方是这个函数里面又定义了一个新函数,这个新函数里面的一个变量正好是外部make_adder的参数.也就是说,外部传递过来的assend参数已经和adder函数绑定到一起了,形成了一个新函数,我们可以把assend看做新函数的一个配置信息,配置信息不同,函数的功能就不一样了,也就是能得到定制之后的函数.

再看看运行结果,我们发现,虽然p和q都是make_adder生成的,但是因为配置参数不同,后面再执行相同参数的函数后得到了不同的结果.这就是闭包.


<function counter.<locals>.incr at 0x03003660>

>>> def counter(start_at = 0):
    count = [start_at]
    def incr():
        count[0] +=1
        return count[0]
    return incr

>>> count = counter(5)
>>> print(count)

<function counter.<locals>.incr at 0x03003618>   我的程序在执行的时候就会报这个错。各种百度都找不到错误啊。上面的代码完全是照着书敲的啊,看来书上也有错误呢。

>>> def counter(start_at = 0):
    count = [start_at]
    def incr():
        return count[0]+1
    return incr()

>>> c=counter(7)
>>> print(c)
8

眼尖的看出是什么原因了么??