最近在看一点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函数算法过程的优化还有点疑问,确定后再记录下。
自己随意写的,有问题还希望大家多指正