Python入门笔记(22):Python函数(5):变量作用域与闭包
一、全局变量与局部变量
一个模块中,最高级别的变量有全局作用域。
全局变量一个特征就是:除非被删除,否则他们存活到脚本运行结束,且对于所有的函数都可访问。
当搜索一个标识符(也称变量、名字等),Python是先从局部作用域开始搜索,如果局部作用域内没有找到那个名字,那么就在全局域找,如果还没有则抛出一个NameError异常。
一个变量的作用域和它寄存的名称空间相关,注意,局部变量会覆盖全局变量。如:
bar = 10
def foo():
bar = 100
return bar
global语句:
为了明确地引用一个已命名的全局变量,必须使用global语句,语法如下:
global var1[,val2...]
bar = 10
def foo():
global bar
return bar
bar = 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()
二、闭包
如果在一个内部函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(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)
闭包的作用:

推荐阅读:Python深入04 闭包
Python入门笔记(22):Python函数(5):变量作用域与闭包的更多相关文章
- python学习笔记三:函数及变量作用域
一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...
- Python入门笔记(20):Python函数(3):关于lambda
一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的.如下: """命名的foo函数&q ...
- Python入门笔记(18):Python函数(1):基础部分
一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...
- Python 包、模块、函数、变量作用域
Python 项目的组织结构 - 包 -- 模块 --- 类 ---- 函数.变量 Python是利用包和模块来组织一个项目的. 包: 包的物理表现是一个文件夹,但是一个文件夹却不一定是个包, ...
- Python学习(21):Python函数(5):变量作用域与闭包
转自 http://www.cnblogs.com/BeginMan/p/3179040.html 一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除, ...
- Python入门笔记(21):Python函数(4):关于函数式编程的内建函数
一.关于函数式编程的内建函数 apply()逐渐被舍弃,这里不讨论 1.filter() #filter(func,seq) """纯Python描述filter函数&q ...
- Python入门笔记(19):Python函数(2):函数/方法装饰器
一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...
- Python入门笔记(14):Python的字符编码
一.字符编码中ASCII.Unicode和UTF-8的区别 点击阅读:http://www.cnblogs.com/kingstarspe/p/ASCII.html 再推荐一篇相关博文:http:// ...
- Python学习笔记之常用函数及说明
Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...
随机推荐
- Android Multiple Screens Android 屏幕适配的一些总结
作为一名Android应用开发程序猿,最痛苦的事莫过于在屏幕适配了,这与历史原因有关,具体就不深究了. 直到最近才搞明白dpi是怎么换算的,在开发的过程中,一个应用运行的屏幕标准应该是分辨率为320x ...
- Codeforces 346C Number Transformation II 构造
题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> # ...
- c#如何区分静态只读变量和常量
常量const 常量就是一个其值永远不会改变的静态字段.常量的值会在编译时自动推算,编译器会在遇到常量时,将其逐个替换为该常量的值.常量可以是C#内建的任何数字类型或枚举类型.声明一个常量的时候必须对 ...
- .Net事件管道详解图
- 基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
基于jQuery的input输入框下拉提示层,方便用户输入邮箱时的提示信息,需要的朋友可以参考下 效果图 // JavaScript Document (function($){ $.fn ...
- iframe高度宽度自适应(转)
http://www.cnblogs.com/snandy/p/3900016.html 跨子域的iframe高度自适应 完全跨域的iframe高度自适应 同域的我们可以轻松的做到 1. 父页面通过i ...
- Android实战技巧:深入解析AsyncTask
AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...
- springmvc下使用kaptcha做验证码
http://www.open-open.com/lib/view/open1395238908947.html
- Http 1.1协议
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间数据交换的过程. 1.Http1. ...
- 验证 Xcode 是否来自正规渠道
由于最近的 Xcode Ghost 事件的发生,所以我们有必要在安装完 Xcode 时验证其是否来自正规渠道. 在终端系统上运行以下命令启用检测: spctl --assess --verbose ...