python闭包变量作用域_Python学习(21):Python函数(5):变量作用域与闭包

一、全局变量与局部变量

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

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

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

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

bar = 10

deffoo():

bar = 100

returnbar

print foo() #100

global语句:

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

global var1[,val2...]

bar = 10

deffoo():

globalbar

returnbar

bar = 10000

print foo() #10000

下面的例子更为详细:

bar = 10 #声明一个全局变量bar

deffoo():

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

嵌套函数作用域:

deffoo():

m = 1

defbar():

n = 2

return m+n

#m +=n #NameError: global name 'n' is not defined

returnbar()

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

returncount[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

闭包的作用:

09095819-08d526fe296c4089a0691ebc3e41f86e.png

更多相关推荐

python闭包变量作用域_Python闭...

Ihavethefollowingcodeinsideafunction:stored_blocks={}defreplace_blocks(m):block=m.group(...

继续阅读

python函数作用域与闭包_理解 Py...

未经作者允许,请勿转载,违者必追究责任。1.作用域Python的作用域可以分为四种:L(Local)局部...

继续阅读

python变量作用域图解_Python学...

1.作用域Python的作用域可以分为四种:L(Local)局部作用域E(Enclosing)闭包函数外的函数中...

继续阅读

python变量及其作用域,闭包

http://blog.csdn.net/pipisorry/article/details/42525939建议参考[Python核心编程2ed.pdf:11...

继续阅读

python闭包变量_Python变量作用...

1、引言最近在刷leetcode题的时候,遇到一个求最长回文子串的题目,于是,我写了如下的代码:c...

继续阅读

python函数作用域与闭包

L:local函数内部作用域E:enclosing函数内部与内嵌函数之间G:global全局作用域B:build_in内置作...

继续阅读

PythonNote5(内嵌函数、作用域...

参考:http://www.opython.com/314.html26内嵌函数的执行示例代码:在上方代码中,大家能够看...

继续阅读

python什么是闭包的作用域_Pytho...

什么是闭包在维基中,闭包的解释是这样的:在计算机科学中,闭包(Closure)是词法闭包(LexicalC...

继续阅读

python函数作用域_python函数作...

作用域变量到底是什么呢?可将其视为指向值的名称。因此,执行赋值语句x=1后,名称x指向值1。...

继续阅读

python 中函数对象、闭包、作用...

函数对象函数名是存放了函数的内存地址,存放了内存地址的变量都是对象,即函数名就是函数对象...

继续阅读