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垃圾回收的几个问题
1.Java垃圾回收有什么目的?什么时候进行垃圾回收? 答:垃圾回收的目的是识别并丢弃应用中不再使用的对象以释放和重用资源. 2.System.gc()和Runtime.gc()会做什么事情? 答:这 ...
- [ZJOI2007]最大半联通子图
这个题,翻译一下题面,就是一个连通图,找他的最长链的数量... 所以说方法就比较明显了:tarjan缩点+拓扑+DP 注意也是本题唯一坑点,拓扑DP的时候要考虑重复边的情况... 呆码: #inclu ...
- method&interface
method Go中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型组合 只能为同一个包的类型定义方法 Receiver可以是类型的值或指针 不存在方法重载 可以使 ...
- 第七十八课 最短路径(Dijkstra)
核心思想是从已知的最短路径推算未知的最短路径. 添加程序: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" #include ...
- Ubuntu安装lrzsz
本文主要介绍在Ubuntu下安装lrzsz工具,方便windows和linux间的文件上传下载 方法1:二进制包自动安装1.1 在终端中,输入命令,自动安装,简单方便: sudo apt-get in ...
- echarts移除百度地图logo方法
移除百度地图LOGO和版权信息 在jsp头上加上如下代码即可: <style type="text/css"> .anchorBL{ display:none } &l ...
- 《CSS揭秘》之毛玻璃效果知识点
实现代码: CodePen:毛玻璃效果 Dabblet:毛玻璃效果 HTML: <main> <blockquote> <em>"The only way ...
- 微信小程序传值以及获取值方法
http://www.51xuediannao.com/xiaochengxu/xiaochengxu-chuanzhi.html
- python print()内置函数
啦啦啦啦啦啦,我又来了,学习任何东西都得坚持,我一定的好好加油!!! 今天来说说print()函数,前边我们已经用过好好多次啦,现在来学习哈吧!!! Python的内置函数,print() print ...
- 2018-2019-2 20165212《网络对抗技术》Exp2 后门原理与实践
2018-2019-2 20165212<网络对抗技术>Exp2 后门原理与实践 1.实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作 ...