8.局部变量/全局变量global/内嵌函数/闭包nonlocal
函数:有返回值
过程:无返回值
注解:在python中,只有函数(每个函数都有返回值),没有过程>>> def hello():print("first")>>> temp = hello() #解释:虽然没有写明返回值,但是
first
>>> print(temp) #打印出来的temp却有值None
None
>>>
python可以返回多个值
>>> def back1(): #返回的值存放在stuple中return 1,2,'Curry'>>> back1()
(1, 2, 'Curry') #元祖stuple>>> def back2(): #返回的值存放在list中return [1,2,'Curry']>>> back2()
[1, 2, 'Curry'] #列表list
变量的作用域(局部变量,全局变量)
存放位置:栈、全局变量区在函数里边定义的参数、变量,它们就是局部变量,出了这个函数,该变量就失效。
函数外部无法访问到这些局部变量。在函数外部定义的变量,全局变量。局部变量、全局变量如果同名,在函数内部,局部变量会覆盖全局变量的值。
>>> count = 5 #全局变量
>>> def MyFun():count = 10 #局部变量print(count)>>> MyFun()
10
>>> print(count)
5
global关键字
告诉python编译器,把后面的变量变成全局变量:
>>> count = 5 #全局变量
>>> def MyFun():global count #把count变量变成全局变量count = 10 #局部变量print(count)>>> MyFun()
10
>>> print(count)
10
内嵌函数(内部函数):函数中有函数
1.
>>> def f2(): #先定义f2()函数print("f2()")>>> def f1(): #在f1()函数中调用f2()函数f2()>>> f1()
f2()2.直接在f1()中定义并调用f2()函数
>>> def f1():def f2(): #在f1()函数中声明f2()函数print("f2 in f1")f2() #在f1()函数中实现f2()函数>>> f1()
f2 in f1
【注解】函数f2()是函数f1()的内嵌/内部函数,f2的作用域只在f1的内部生效,超出f1外,函数f2不可见。
闭 包
http://www.cnblogs.com/ma6174/archive/2013/04/15/3022548.html
闭包的条件:
- 函数funA中有内嵌函数funB
- 函数funA返回值是funB
- 函数funA中有自由变量temp
- 并且,自由变量temp在funB中被使用
那么:函数funA执行完成后,自由变量temp暂时不被回收,因为temp又被函数funB使用。【例】
>>> def funA(temp):def funB(bb):return temp*bbreturn funB>>> funA(10)(20)
200>>> a = funA(100)
>>> a(20)
120解释:funA被调用的时候产生一个闭包——funB,并且funB闭包持有funA中的自由变量temp,当funA函数的生命周期结束之后,temp变量依然存在,
因为temp被闭包funB使用了,暂时不会被回收。
【闭包的作用域问题】
>>> def f():a = 1 #② a是g()函数的“非全局的外部变量”def g():a = 2print aprint a #①return g>>> f()()
1
2先执行①
在return g中执行②
>>> def f():count = 5 #5是g()函数"非全局的的外部变量",因此在g()函数中不认识count=5def g():count = count+100 #因此count在此时并没有初始值,所以没有初始值的count+100会报错return g
执行结果:报错
>>> f()()Traceback (most recent call last):File "<pyshell#157>", line 1, in <module>f()()File "<pyshell#156>", line 4, in gcount = count+100
UnboundLocalError: local variable 'count' referenced before assignment #count在引用前没有被赋值【解决方案1】使用list列表:把"非全局变量的外部变量"放在list中,
然后再使用。【因为】在python中,list中的元素是全局变量,不是局部变量。
>>> def f():count = [5,10,121,20]def g():count[0] = count[0]+100count[1] = count[1]+100print count[0],count[1]return g>>> f()()
105 110上面把[5,10,121,20]放在list中,相当于变成了全局变量,
不会出现没有赋值的错误。【解决方案2】python3中引出了关键字nonlocal
def hellocounter (name):count=0 def counter():nonlocal count #声明为全局变量count+=1print 'Hello,',name,',',str(count[0])+' access!'return counterhello = hellocounter('ma6174')
hello()
hello()
hello()
Python中怎么创建闭包?
在Python中创建一个闭包可以归结为以下三点:
- 闭包函数必须有内嵌函数
- 内嵌函数需要引用该嵌套函数上一级namespace中的变量
- 闭包函数必须返回内嵌函数
http://www.jb51.net/article/54498.htm
8.局部变量/全局变量global/内嵌函数/闭包nonlocal相关推荐
- 零基础入门学习Python(19)-内嵌函数和闭包
global关键字 全局变量的作用域是整个模块,也就是代码段内所有的函数内部都可以访问到全局变量 注意,在函数内部仅仅去访问全局变量就好,不要试图去修改它,如果随意修改全局变量的值,很容易牵一发而动全 ...
- 课时20:内嵌函数和闭包
目录: 一.global关键字 二.内嵌函数 三.闭包 四.课时20课后习题及答案 ******************** 一.global关键字 ******************** 全局变量 ...
- 小甲鱼python第二十讲(内嵌函数和闭包)
内嵌函数 def fun1():print("fun1正在被调用...")def fun2():print("fun2正在被调用..")fun2()#在fun1 ...
- python中闭包函数_Python的闭包问题(关于内嵌函数引用闭包函数的变量问题)
一.闭包: 记得:闭包的特性就是:内嵌函数会保存它引用的外围函数的变量值. 闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数和被引用的变量等 ...
- Python--12 内嵌函数和闭包
内嵌函数/内部函数 >>> def fun1(): ... print('fun1()正在调用') ... def fun2(): ... print('fun2()正在被调用') ...
- 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念. 我是从这里看来的: http://blog.dreambrook.com/soloist/archive/2005/03/13/526.a ...
- 使用匿名函数和内嵌函数处理多变量传递问题
问题:有一个多变量函数f(abcx),现需要分别在a=a0b=b0c=c0和a=a1b=b1c=c1的条件下对f(abcx)进行某一操作. 此类问题常在数值积分时出现. 解决方案: 1. 使用全局变量 ...
- function函数嵌套 matlab_Matlab函数进阶:使用匿名函数和内嵌函数处理多变量传递问题...
Matlab 函数进阶: 使用匿名函数 (Anonymous Function) 和内嵌函数 (Nested Function) 处理多变量传递问题 (Matlab 7.0 以上 ) 问题: 有一个多 ...
- Python函数05/内置函数/闭包
Python函数05/内置函数/闭包 内容大纲 1.内置函数(二) 2.闭包 1.内置函数(二) #(abs()) 绝对值--返回的都是正数 #print([abs(i) for i in lst]) ...
最新文章
- 内核中的HZ 及延迟等
- Python(1) 整型与浮动型
- JDK11的新特性:新的HTTP API
- 前端wxml取后台js变量值_这些鲜为人知的前端冷知识,你都GET了吗?
- in-nan(ind)_NaN16 Constant in Julia
- hive 配置mysql_Hive的mysql安装配置
- centos修改主机名的正确方法
- oracle 修改sgamaxsize_Oracle修改表空间大小
- 自动特征工程在推荐系统中的研究
- flow使用_使用Microsoft Flow进行文本分析
- exchange加mysql_Exchange 事务和Exchange 数据库回顾
- 惠普m128fn中文说明书_hp m125m126m127m128使用说明.pdf
- Android面试准备复习之Android知识点大扫描
- C#ObjectArx Cad添加图层
- Vasya the Hipster - CodeForces - 581A
- 数据结构概述3 对称矩阵、树和二叉树
- webassembly学习-modules
- Bazel build Remote-caching
- C中输入半径计算球体的体积
- Axure RP8 图片手风琴