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

推荐阅读:Python深入04 闭包
Python学习(21):Python函数(5):变量作用域与闭包的更多相关文章
- Python入门笔记(22):Python函数(5):变量作用域与闭包
一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除,否则他们存活到脚本运行结束,且对于所有的函数都可访问. 当搜索一个标识符(也称变量.名字等),Pyt ...
- Python学习笔记:函数和变量详解
一.面向对象:将客观世界的事物抽象成计算机中的数据结构 类:用class定义,这是当前编程的重点范式,以后会单独介绍. 二.函数编程:逻辑结构化和过程化的一种编程方法 1.函数-->用def定义 ...
- Python学习-21.Python的代码注释
在Python中有两种注释,一种是普通注释,另一种是文档注释. 普通注释是使用#开头 print('output something') # here is comment 而Python中多行注释也 ...
- Python学习day09 - Python进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day05 - Python基础(3) 格式化输出和基本运算符
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- 二十一. Python基础(21)--Python基础(21)
二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性: #类.属性: 调用的就是类中的属性 #对象.属性: 先从自己的内存空间里找名 ...
- python学习笔记三:函数及变量作用域
一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...
- python学习-day15:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r
---恢复内容开始--- 一.全局变量与局部变量 在子程序中定义的变量称为局部变量, 在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序.当全局变量与 ...
- Python学习之路——函数对象作用域名称空间
一.函数对象 # 函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象 # 函数对象的应用 # 1 可以直接被引用 fn = cp_fn # 2 可以当作函数参数传 ...
随机推荐
- C#基础--------------------C#正则表达式
为了避免以后这样的情况,在此记录下正则表达式的一些基本使用方法附带小的实例.让以后在使用时能一目了然知道他的使用,为开发节约时间,同时也分享给大家 正则元字符 在说正则表达式之前我们先来看看通配符,我 ...
- Activiti5小试牛刀demo流程
demo流程目标:刚接触Activiti5,先大致了解下Activiti5的架构,熟悉下开发流程 搭建开发环境 首先给MyEclipse安装Activiti Designer插件,下载网址http:/ ...
- JSP——MVC模式+Servlet生命周期
设计模式MVC模式 模型MODEL操作数据库的增删改查——javaBean 视图VIEW显示数据——JSP 控制器CONTROLLER响应用户的——servlet Model(模型),是程序的主体部分 ...
- CentOS 65 安装vmware tools 杂记
CentOS 65中安装vmware tools时出现如下错误, centos vmware tools install failure ,no default label for /tmp/vmwa ...
- ClangFormat代码格式化
下载地址:https://github.com/travisjeffery/ClangFormat-Xcode 配合Xcode自带的格式化操作,就很不错了 选中内容组合操作: 第一步:ClangFor ...
- Vue.nextTick和Vue.$nextTick
`Vue.nextTick(callback)`,当数据发生变化,更新后执行回调. `Vue.$nextTick(callback)`,当dom发生变化,更新后执行的回调. 参考原文:http://w ...
- sql2008修改管理员与普通用户密码
方法一: sp_password Null,'123,'sa'把sa的密码设为“123” 执行成功后有“Command(s) completed successfully.” OK! 方法二: 第一步 ...
- springMVC中如何访问WebContent中的资源文件
一.问题: 我的工程目录如下: WebContent |-css |-js |-imgs |-META-INF |-WEB-INF |-jsp |-login.jsp 如何在login.jsp中引用i ...
- IE8 AJAX 不能正常工作 解决办法
function crossDomainAjax(url, successCallback) { // IE8 & 9 only Cross domain JSON GET request i ...
- 通过MyEclipse部署web应用程序开发环境
1.下载并安装MyEclipse10 2.配置java开发的jar包 3.配置tomcat服务器 4.部署tomcat服务器 点击Bronse可以查看部署后的文件夹目录 5.启动tomcat服务器 6 ...