python函数作用域,嵌套函数,闭包
函数作用域
命名空间:
从python解释器开始执行之后,就在内存中开辟了一个空间,每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。我们给这个“存放名字与值的关系”的空间起了一个名字——叫做命名空间
代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间
命名空间的本质: 存放变量名和值的绑定关系。 命名空间种类:全局名名空间,局部命名空间,内置命明空间 * 内置明明空间中保存的python内置方法的绑定关系。 命名空间的取值顺序 : 局部命明空间----全局命名空间------内置命名空间 作用域:
作用域时按范围分的,分为全局作用域和局部作用域,全局作用域中的变量叫全局变量,局部作用域中的叫局部变量。 全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效 局部作用域:局部名称空间,只能在局部范围内生效 查看全局变量和局部变量的方法分别是globals 和 locals。 在局部如果可以直接引用全局变量,如果想要修改就需要用到 global 关键字
name = "Alex" # 定义一个全局变量name
def user():
global name # 引用全局变量name
name = "alex" # 给全局变量name重新赋值
print(name) user()
print(name) # 这里打印出来的就是更改后的name
函数嵌套:
在函数的内部又声明了另一个函数,就叫函数的嵌套。
def f1():
a = 5
print(a) # 函数f1定义了一个变量a,所以会从自己内部找a的值 def f2():
print(a) # 函数f2并未定义变量a,所以回去上一级f1中去找变量a的值 def f3():
a = 6
print(a) # 函数f3中定义了变量a,所以会输出自身中定义的a的值,函数内部的变量是独立的,所以并不会改变上级函数中a的值 f3()
f2() f1()
如果想要改变外部函数的中的变量a的值,需要用到关键字 nonlocal
1.外部必须有这个变量
2.在内部函数声明nonlocal变量之前不能再出现同名变量
3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
def f1():
a = 3
def f2():
nonlocal a
a = 2
f2()
print(a)
f1()
闭包:
当一个内部函数引用了他外部函数中的变量,并在外部函数中被调用时就会形成闭包。
一般我们这样使用闭包:
def ouder():
name = "Alex" def inner():
print(name)
return inner # 这里时ouder函数的返回值 f = ouder() # f拿到的时ouder函数的返回值inner
f() # 这里f()就相当于inner()
判断闭包的方法 __closure__ , 根据打印的结果中是否以cell元素开头判定函数是不是闭包。
def ouder():
name = "Alex" def inner():
print(name)
print(inner.__closure__) return inner # 这里时ouder函数的返回值 f = ouder() # f拿到的时ouder函数的返回值inner
f() # 这里f()就相当于inner()
python函数作用域,嵌套函数,闭包的更多相关文章
- 一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!
Python函数定义.匿名函数.嵌套函数.闭包.装饰器 目录 Python函数定义.匿名函数.嵌套函数.闭包.装饰器 函数核心理解 1. 函数定义 2. 嵌套函数 2.1 作用 2.2 函数变量作用域 ...
- Python基础--函数的嵌套和闭包
一.名称空间和作用域 名称空间:Python所有有关命名的操作都是在操作名称空间,例如变量名,函数名 1.内置名称空间:Python解释器提供好的功能,解释器启动跟着一起启动,是全局作用域 2.全局名 ...
- python函数调用顺序、高阶函数、嵌套函数、闭包详解
一:函数调用顺序:其他高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用错误示范: def foo(): print 'in the foo' bar() foo() 报错: i ...
- day4_python之名称空间与作用域、闭包函数、嵌套函数
一.名称空间与作用域 名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方 内置名称空间:在python解释器启动时产生,存放一些python内置的名字 全局名称空间:在执行文件 ...
- Python中函数的嵌套及闭包
函数的嵌套 调用:在函数中调用函数 定义:在函数中定义函数 地址:函数名有内存地址,内存地址可赋值 示例 a = 1 def outer(): a = 1 def inner(): a = 2 def ...
- day20 Python 高阶函数,函数,嵌套,闭包 装饰器
高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): ...
- Python 变量作用域与函数
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- day12 函数的嵌套调用 闭包函数,函数对象
函数嵌套: 函数嵌套: 嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数 按照函数的两个阶段 嵌套调用 指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码, ...
- 深入理解JS函数作用域链与闭包问题
function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.f ...
- python之6-3嵌套函数
1. 嵌套函数 子函数可以继承父函数的变量 父函数返回子函数 子函数返回结果 看例子如下:结果是一个字符串fun1+fun2 #!/usr/bin/env python # coding=utf-8 ...
随机推荐
- java中一些对象(po,vo,dao,pojo)等的解释
一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对 ...
- Spring 源码学习(4)—— bean的加载part 1
前面随笔中,结束了对配置文件的解析工作,以及将配置文件转换成对应的BeanDefinition存储在容器中.接下来就该进行bean的加载了. public Object getBean(String ...
- Markup解析XML——文档,说明
链接:http://pan.baidu.com/s/1slMwEc9 密码:slz7 上面是网盘的地址,因为来源已经找不到了,在这里给这个作者说声谢谢. 轻量级的XML解析器使用比较简单,下载Mark ...
- 网站文档模式总是以Quirks文档模式解析网站
<meta name="renderer" content="webkit"/> <meta http-equiv="X-UA-Co ...
- C++取反交换两个数的值
int a = 1; int b = 2; cout << "a: "<< a << endl; cout << "b: ...
- ProtocolBuffer for Objective-C 运行环境配置及使用
1,我已经安装了brew.pod.protoc,如果您没安装,请按照下面方式安装. 安装很简单,对着README操作一遍即可,我贴出自己在终端的命令行.需要输入的命令行依次为:1)打开终端,查看mac ...
- CCF-再卖菜-20180904
可以说这道题出的不错,我是用动态规划做的 ( 严谨点说应该是记忆化搜索,我是递归版本,非递归我不会啊... 题意分析: x1 x2 x3 已知 x1+x2=t1或t1+1 x1+x2+x3=t2 ...
- python学习之路08——元组、集合
一. 元组 1.概念 列表:是一种有序的集合 元组和列表的区别: a.列表:[] 元组:() b.列表中的元素可以进行增加和删除操作,但是,元组中的元素不能进行修改 c.相同点:都是一种容 ...
- Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌
1.Map集合概述和特点 * A:Map接口概述 * 查看API可以知道: * 将键映射到值的对象 * 一个映射不能包含重复的键 * 每个键最多 ...
- 《Linux内核原理与分析》第八周作业
课本:第七章 可执行程序工作原理 ELF目标文件格式 目标文件:编译器生成的文件. 目标文件的格式:out格式.COFF格式.PE(windows)格式.ELF(Linux)格式. ELF(Execu ...