Python、Javascript中的闭包比较

 更新时间:2015年02月04日 09:33:03   投稿:junjie  
这篇文章主要介绍了Python、Javascript中的闭包比较,本文分别讲解了Python和Javascript中的闭包,分对它们的不同做了一个简单的比较,需要的朋友可以参考下

同为脚本语言,python和Javascript具有相似的变量作用域,不像php,函数的内部的所有变量和外部都是隔绝的,也就是说,函数要想处理其外部的数据,必须使用参数把需要处理的数据传递进来(使用global关键词这里不讨论),而python和Javascript不同,如果在函数声明变量,它会逐级网上查找,直到返回着个值或者未定义。

那么这样说,python的闭包应该很简单了,像javascript一样,我们编写类似的代码:

def func1():
    a = 1
    def func2():
        a = a + 1
        return a
    return func2
re=func1()
print re()
print re()


但是,实际情况是,结果并没有出现我们预期中的打印出2和3,反而出现了这样的错误:”UnboundLocalError: local variable ‘a' referenced before assignment”(局部变量a赋值之前被引用)。为什么会出现这样的问题,我们先看看js是如果实现这个闭包的:

<script>
 function func1(){
 var a=1;
  function func2(){
  a=a+1;
  return a;
  }
 return func2;
 }
re=func1();
console.log(re());
console.log(re());
</script>

上面这段代码的运行结果如我们所料,输入2和3。注意一下这段程序的第5行,如果我在前面加上一个var,这段程序运行的结果是什么样的呢?最终结果是输入了两个“NaN”,在火狐的开发者平台上,找到了关于var这样的描述:

Declares a variable, optionally initializing it to a value.
The scope of a variable declared with var is the enclosing function or, for variables declared outside a function, the global scope (which is bound to the global object).

意思是说,var是用来声明局部变量的,上面的例子中,如果用var a=a+1,这时候的a就已经是func2中的局部变量,而不会从func1中继承,所以最后会出现NaN的结果。

让我们回到python的这个闭包上来,这个错误提示的意思也是说a是个局部变量,实际上,python规定所有在赋值语句左面的变量都是局部变量,这个a在等号左边,所以成了一个局部的变量,导致我访问不到func1中的a。这个问题怎么解决呢?如果是在python3.0以上,在a=a+1之前,可以用nonloacal a来指定a不为局部变量。3.0以下的版本不支持nonloacal关键字,我们可以这样做:

def func1():
    a = [1]
    def func2():
        a[0] = a[0] + 1
        return a[0]
    return func2
re=func1()
print re()
print re()

运行结果如我们所料,打印出了2和3。从python和Javascript闭包的例子,要了解python和js变量声明,变量作用域的相似和不同之处。

相关文章

  • Python中json库的操作指南

    Python中json库的操作指南

    JSON是存储和交换文本信息的语法,类似XML,JSON比XML更小、更快,更易解析,且易于人阅读和编写,下面这篇文章主要给大家介绍了关于Python中json库的操作指南,需要的朋友可以参考下
    2023-04-04
  • python 类中函数名前后加下划线的具体使用

    python 类中函数名前后加下划线的具体使用

    在Python编程语言中,函数名前后有下划线是一种常见的命名约定,,被广泛应用于类中的函数,本文将介绍下划线命名风格的由来、使用场景以及如何正确应用它,感兴趣的可以了解一下
    2024-01-01
  • Python获取Cookie的方法总结

    Python获取Cookie的方法总结

    在Web开发中,Cookie是一种常用的技术,用于在Web服务器和浏览器之间存储和传输数据,本文将详细介绍Python中获取Cookie的方法,包括HTTP请求、Web框架和Cookie管理库的用法,同时提供示例代码来演示这些方法的实际应用,需要的朋友可以参考下
    2023-11-11
  • Pytorch之finetune使用详解

    Pytorch之finetune使用详解

    今天小编就为大家分享一篇Pytorch之finetune使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python dataframe如何选择某一列非空的行

    python dataframe如何选择某一列非空的行

    这篇文章主要介绍了python dataframe如何选择某一列非空的行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python接口自动化系列之unittest结合ddt的使用教程详解

    Python接口自动化系列之unittest结合ddt的使用教程详解

    这篇文章主要介绍了Python接口自动化系列之unittest结合ddt的使用教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 手把手教你python实现SVM算法

    手把手教你python实现SVM算法

    这篇文章主要为大家详细介绍了手把手教你python实现SVM算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 利用 PyCharm 实现本地代码和远端的实时同步功能

    利用 PyCharm 实现本地代码和远端的实时同步功能

    这篇文章主要介绍了利用 PyCharm 实现本地代码和远端的实时同步功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • python常用函数详解

    python常用函数详解

    本文给大家总结了python中常用函数,非常的细致全面,有需要的小伙伴可以参考下
    2016-09-09
  • python 生成目录树及显示文件大小的代码

    python 生成目录树及显示文件大小的代码

    没啥技术含量,大家都说没用,只不过算法还有点意思。自己憋出来的,不知道是不是跟别人的一样。做递归得到子文件夹以及文件并不难,但是能够打印出树形,层次关系展示出来,有些难度。
    2009-07-07

最新评论