zoukankan      html  css  js  c++  java
  • 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函数算法过程的优化还有点疑问,确定后再记录下。

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

  • 相关阅读:
    PERL 学习
    javascript
    Netfilter
    PHP内核探索
    Linux内存管理学习笔记 转
    使用mysqladmin ext 了解MySQL运行状态 转
    在ArcGIS Desktop中进行三参数或七参数精确投影转换
    AE 栅格图分级渲染
    ArcEngine标注和注记
    ArcGIS Engine 线段绘制
  • 原文地址:https://www.cnblogs.com/xiapuxiaohei/p/8243203.html
Copyright © 2011-2022 走看看