python初探:关于闭包

最近在看一点python知识,直接看的廖雪峰老师的python3教程在看闭包的时候感到有点疑问,感觉和之前看的闭包使用方式不太一样。

 

闭包 我自己的理解,就是内部(匿名)函数引用外部函数变量,导致变量声明周期出现与常规情况不一致的现象。

 

在python闭包中按下面的方式去定义:

def createCounter():
    x = 1def f():
        x = x + 1
        return (fs[0])
    return f

f = createCouter()

f()
f()

会提示x未声明就使用

查了下原因其实就是由于python的命名空间导致的,

 python对于变量的声明不需要单独提出来,所以x = x +1 这句代码包含了对于 x 的声明,但是在赋值阶段又引用了x 此处由于已经在内部函数中声明了x 所以会直接指向自身,导致了问题。

  这里又感觉对python命名空间机制不太了解顺便也查了下:  https://www.cnblogs.com/livingintruth/p/3296010.html  这位老师已经写的就挺清楚的啦  在此处如果在外部函数   声明 nonlocal(global)  x  就能正常执行了

  因为默认在函数内部local空间声明了个新的x  

def createCounter():
    fs = [0]
    def f():
        fs[0] += 1
        return (fs[0])
    return f

这种方式没有出现问题的原因也就是应为fs的声明没有出问题,和网友们提到的全局变量之类的没有关系(https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431835236741e42daf5af6514f1a8917b8aaadff31bf000#0)。

可以说是python对声明的简化导致了这里闭包使用过程中的一点点别扭。另外对于python3中对于filter函数算法过程的优化还有点疑问,确定后再记录下。

自己随意写的,有问题还希望大家多指正

posted @ 2018-01-08 16:06  下铺小黑  阅读(189)  评论(0编辑  收藏  举报