zoukankan      html  css  js  c++  java
  • python闭包

    闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。闭包是是指引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,闭包是由函数和与其相关的引用环境组合而成的实体。

    如果在一个内嵌函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内嵌函数就被认为是闭包(closure)。

    定义在外部函数内但由内部函数引用或者使用的变量称为自由变量。

     

    总结一下,创建一个闭包必须满足以下几点:
      1. 必须有一个内嵌函数
      2. 内嵌函数必须引用外部函数中的变量
      3. 外部函数的返回值必须是内嵌函数

    举例:

    1 def func(name):
    2     def func_in(grend):
    3         print(name,grend)
    4     return func_in
    5 
    6 func('test',1)

     

    这里当调用 func 的时候就产生了一个闭包func__in,并且该闭包持有自由变量  name,因此这也意味着,当函数func的生命周期结束之后,name这个变量依然存在,因为它被闭包引用了,所以不会被回收。

     

    Python中的namespace

    Python中通过提供 namespace 来实现重名函数/方法、变量等信息的识别,其一共有三种 namespace,分别为:

    • local namespace: 作用范围为当前函数或者类方法
    • global namespace: 作用范围为当前模块
    • build-in namespace: 作用范围为所有模块

    当函数/方法、变量等信息发生重名时,Python会按照 “local namespace -> global namespace -> build-in namespace”的顺序搜索用户所需元素,并且以第一个找到此元素的 namespace 为准。

    同时,Python中的内建函数locals()和globals()可以用来查看不同namespace中定义的元素。

  • 相关阅读:
    Android&Java面试题大全—金九银十面试必备
    android招聘啦,美图秀秀欢迎你加入!
    android经典源码,很不错的开源框架
    MongoDB、Hbase、Redis等NoSQL优劣势、应用场景
    体验go语言的风骚式编程
    金九银十中,看看这31道Android面试题
    android高级页面效果集锦
    flask中的request
    flask笔记(三)Flask 添加登陆验证装饰器报错,及解析
    flask笔记(二)
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9004003.html
Copyright © 2011-2022 走看看