Python、Javascript中的闭包比较

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

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

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

登录后复制

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

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

登录后复制

上面这段代码的运行结果如我们所料,输入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关键字,我们可以这样做:

立即学习“Java免费学习笔记(深入)”;

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

登录后复制

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2292506.html

(0)
上一篇 2025年2月28日 01:50:50
下一篇 2025年2月26日 23:37:08

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 线程和进程的区别及Python代码实例

    在程序猿的世界中,线程和进程是一个很重要的概念,很多人经常弄不清线程和进程到底是什么,有什么区别,本文试图来解释一下线程和进程。首先来看一下概念: 进程(英语:process),是计算机中已运行程序的实体。进程为曾经是分时系统的基本运作单位…

    2025年2月28日
    200
  • Python中用pycurl监控http响应时间脚本分享

    最近需要对节点到源站自己做个监控,简单的ping可以检测到一些东西,但是http请求的检查也要进行,于是就研究了下pycurl。 pycurl是个用c语言实现的python 库,虽然据说不是那么pythonic,但是却很高效,它支持的协议居…

    编程技术 2025年2月28日
    200
  • Python列表(list)常用操作方法小结

    常见列表对象操作方法: list.append(x) 把一个元素添加到链表的结尾,相当于 a[len(a):] = [x] 。 list.extend(L) 将一个给定列表中的所有元素都添加到另一个列表中,相当于 a[len(a):] = …

    编程技术 2025年2月28日
    200
  • Python实现在Linux系统下更改当前进程运行用户

    在上一篇文章中,我们讲了如何在linux上用python写一个守护进程。主要原理是利用linux的fork函数来创建一个进程,然后退出父进程运行,生成的子进程就会成为一个守护进程。细心观察的可能会发现,这个守护进程的运行身份是执行这个程序的…

    编程技术 2025年2月28日
    200
  • Python Sleep休眠函数使用简单实例

    Python 编程中使用 time 模块可以让程序休眠,具体方法是time.sleep(秒数),其中“秒数”以秒为单位,可以是小数,0.1秒则代表休眠100毫秒。 复制代码 代码如下:# 例1:循环输出休眠1秒import timei = …

    编程技术 2025年2月28日
    200
  • Python中实现从目录中过滤出指定文件类型的文件

    最近学习下python,将从指定目录中过滤出指定文件类型的文件输出的方法总结一下,供日后查阅 复制代码 代码如下:#!/usr/bin/env python import globimport osos.chdir(“./”)for fil…

    编程技术 2025年2月28日
    200
  • Python实现Const详解

    python语言本身没有提供const,但实际开发中经常会遇到需要使用const的情形,由于语言本身没有这种支出,因此需要使用一些技巧来实现这一功能 定义const类如下 复制代码 代码如下:import sysclass Const(ob…

    编程技术 2025年2月28日
    200
  • Python标准异常和异常处理详解

    python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。 1.异常处理: 本站Python教程会具体介绍。2.断言(Assertions):本站Python教程会具体介绍。…

    编程技术 2025年2月28日
    200
  • python映射列表实例分析

    本文实例讲述了python映射列表。分享给大家供大家参考。具体分析如下: 列表映射是个非常有用的方法,通过对列表的每个元素应用一个函数来转换数据,可以使用一种策略或者方法来遍历计算每个元素。 例如: 复制代码 代码如下:params = {…

    编程技术 2025年2月28日
    200
  • Python操作MySQL简单实现方法

    本文实例讲述了python操作mysql简单实现方法。分享给大家供大家参考。具体分析如下: 一、安装: 安装MySQL 安装MySQL不用多说了,下载下来安装就是,没有特别需要注意的地方。 一个下载地址:点击打开链接 立即学习“Python…

    编程技术 2025年2月28日
    200

发表回复

登录后才能评论