zoukankan      html  css  js  c++  java
  • Python学习(21):Python函数(5):变量作用域与闭包

    转自 http://www.cnblogs.com/BeginMan/p/3179040.html

    一、全局变量与局部变量

    一个模块中,最高级别的变量有全局作用域。

    全局变量一个特征就是:除非被删除,否则他们存活到脚本运行结束,且对于所有的函数都可访问。

    当搜索一个标识符(也称变量、名字等),Python是先从局部作用域开始搜索,如果局部作用域内没有找到那个名字,那么就在全局域找,如果还没有则抛出一个NameError异常。

    一个变量的作用域和它寄存的名称空间相关,注意,局部变量会覆盖全局变量。如:

    bar = 10
    def foo():
        bar = 100
        return bar
    
    print foo() #100

    global语句:

    为了明确地引用一个已命名的全局变量,必须使用global语句,语法如下:

    global var1[,val2...]

    bar = 10
    def foo():
        global bar
        return bar
    
    bar = 10000
    print foo() #10000

    下面的例子更为详细:

    bar = 10            #声明一个全局变量bar
    def foo():
        global bar      #指定bar是全局变量,谁都不能替换!但是能修改原值!
        bar2 = 0.1      #声明一个局部变量bar2
        bar = 0.0001    #是对全局变量bar的修改,而不是在又声明一个局部变量将全局变量覆盖。
        return bar+bar2
    
    bar = 10000         #又对全局变量bar进行修改,但是为时已晚了,因为在foo函数里已经 return bar+bar2了
    print foo()         #综上,输出:0.1001

    嵌套函数作用域:

    def foo():
        m = 1
        def bar():
            n = 2
            return m+n
    #    m +=n   #NameError: global name 'n' is not defined
        return bar()
    
    print foo() #3

    二、闭包

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

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

    闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。

    不同的语言实现闭包的方式不同。Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看到Python使用对象来实现一些特殊的语法)。Python一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。

    参考:http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html

    如实现一个计数的闭包例子:

    def counter(start_at=0):
        count = [start_at]
        #内部函数incr()实现计数
        def incr():         #定义一个内部函数,在内部使用变量count,创建一个闭包
            count[0]+=1
            return count[0]
        return incr         #返回一个可调用的函数对象
    
    #看起来和实例化一个counter对象并执行这个实例是多么相似
    count = counter(5)
    for i in range(10):
        print count(),  #6 7 8 9 10 11 12 13 14 15
        
    count = counter(100)
    print count()       #101

    闭包的作用

    推荐阅读Python深入04 闭包

  • 相关阅读:
    CSS旧版flex及兼容
    深入理解CSS弹性盒模型flex
    CSS文本方向
    文本溢出text-overflow和文本阴影text-shadow
    深入理解CSS中的空白符和换行
    CSS中常见的6种文本样式
    理解CSS相对定位和固定定位
    CSS绝对定位的应用
    深入理解CSS绝对定位absolute
    深入理解CSS中的margin负值
  • 原文地址:https://www.cnblogs.com/nolonely/p/6641587.html
Copyright © 2011-2022 走看看