python之名称空间与函数对象
名称空间
名称空间就是变量名与变量值绑定关系的地方。比如对于x=1,1存放于内存空间,而x与1的对应关系存储在名称空间中。
名称空间分为三类:内置名称空间、全局名称空间、局部名称空间。

内置名称空间
内置名称空间存储的是python解释器提前给我们定义好的,像len()、print()、open()等。
存活周期:python解释器运行则产生,关闭则销毁。
全局名称空间
名字只要不是在函数里的运行产生的,都会存到全局名称空间。
name = 'jason' # 变量名name存入全局名称空间
def index(): # 函数名index存入全局名称空间
pass
if True:
a = 111 # 变量名a存入全局名称空间
for i in range(10): # 变量名i存入全局名称空间
pass
while True:
b = 222 # 变量名b存入全局名称空间
存活周期:python文件开始运行时产生,运行完毕时销毁。
局部名称空间
名字只要是在函数里的运行产生的,都会存到局部名称空间。
def index():
name = 'jason' # 变量名name存入局部名称空间
存活周期:函数被调用时产生,函数调用结束时销毁。
名称的查找顺序
如果要去找一个名称,有这么多个名称空间,我们该去那个名称空间找呢?
在查找名称之前,要先知道直接在哪一个空间内。知道了自己所在的空间后,先在自己空间内查找,找不到在向外寻找,所以查找顺序应该是:局部名称空间 >>> 全局名称空间 >>> 内置名称空间

# 案例一
len = '我是全局名称空间中的len'
def index():
len = '我是局部名称空间中的len'
print(len) # 输出:我是局部名称空间中的len
index() # 调用函数 函数体就会执行 就会产生局部名称空间
print(len) # 输出:我是全局名称空间中的len
# 案例二
x = 111
def f1():
x = 222
def f2():
x = 333
print(x)
f2()
f1() # 输出:333
作用域
作用域就是名称空间能够作用的范围,按照名字作用范围的不同可以将三个名称空间划分为两个区域:
- 全局作用域:全局存活,全局有效,内置名称空间和全局名称空间就是处于全局范围的。
- 局部作用域:临时存活,局部有效,局部名称空间就是处于局部范围的。
global关键字
那么问题来了,我们该如何在局部内修改全局的名称的值呢?
如果全局名称空间中的名称是可变类型:
l = [1, 2, 3]
def index():
l.append(4)
index()
print(l) # 输出:[1, 2, 3, 4]
如果全局名称空间中的名称是不可变类型:
x = 100
def index():
global x # 使用关键字声明,说明之后的x使用的是全局的x
x = 200
index()
print(x) # 输出:200
"""如果想要在局部名称空间中修改全局名称空间中的名字 那么需要使用关键字global申明"""
nonlocal关键字
问题又来了,知道了怎么在局部名称空间中修改全局名称空间中的名字,那么局部名称空间有多层嵌套该如何修改外层的名字呢?
比如:
def index():
x = 100
def f():
# 如何在f()函数里修改x的值?
f()
print(x)
同样,这个时候也是需要一个关键字,这个关键字就是nonlocal。
def index():
x = 100
def f():
nonlocal x # 使用nonlocal关键字,说明之后的x使用的是外层的x
x = 200
f()
print(x) # 输出:200

函数名的多种用法
用法一:函数名当做变量名赋值
def index():
print('来自函数index')
res = index # 让res也指向index指向的函数体代码
res() # 相当于执行了index()
# 输出:来自函数index
用法二:函数名当函数的实参
def index():
print('来自函数index')
def func(a):
a()
func(index) # 实参index传给形参a,func函数内部的a()变成了index()
# 输出:来自函数index
用法三:函数名当做函数的返回值
def func():
return index # 将函数名当做返回值
def index():
print('来自函数index')
res = func() # res接收函数名index
res() # 相当于执行了index()
# 输出:来自函数index
用法4:函数名作为容器类型的元素
def index():
print('来自函数index')
l1 = [1, 2, 3, index]
l1[-1]() # 相当于执行了index()
# 输出:来自函数index
函数的嵌套
函数的嵌套其实就与if、while、for循环的嵌套一样,这里只做简单展示。
# 函数嵌套死循环
def index():
func()
print('来自index')
def func():
index()
print('来自func')
func()

python之名称空间与函数对象的更多相关文章
- Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数
本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...
- Python(名称空间、函数嵌套、函数对象)
一.名称空间: 名称空间 定义:存放名字和值的绑定关系 内置名称空间 python自带的名字,如print.int.str 解释器启动就会生效 全局名称空间 文件级别定义的名字,都会放 ...
- python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义
复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...
- day 23 对象的名称空间 类,对象属性和方法 封装 接口提供
一.对象的特有名称空间 # 对象独有的名称空间:在产生对象时就赋初值 '''class ted: def func(): 当func里不存在参数时,调用时不需要给值 print('hah')ted.f ...
- Python 的名称空间和作用域
最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...
- python之名称空间
1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类的数据属性是共享给所有对象 print(id(g1.c ...
- Python基础—名称空间(Day10)
一.名称空间和作用域 1.全局名称空间(名称空间.命名空间): py文件运行时代码从上之下依次执行,看到一个变量就会将这个变量与对应值的内存地址的关系存到名称空间里,代码要运行时(print时)从名称 ...
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域
一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...
- python基础之函数参数,名称空间,以及函数嵌套
函数进阶内容梗概: 1. 函数参数--动态传参 2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序. 3. 函数的嵌套 4. gloabal , nonlocal 关键字 1. 函 ...
随机推荐
- Creating a File View
创建文件视图 为了映射一个文件的数据到进程的虚拟内存,你必须创建一个文件的视图.MapViewofFile和MapViewofFileEX使用CreateFileMapping返回的句柄,在虚拟地址空 ...
- 结合Vue.js的前端压缩图片方案
这是一个很简单的方案.嗯,是真的. 为什么要这么做? 在移动Web蓬勃发展的今天,有太多太多的应用需要让用户在移动Web上传图片文件了,正因如此,我们有些困难必须去攻克: 低网速下上传进度缓慢,用户体 ...
- ps基础总结
1.复制图层:首先选中移动工具(V),鼠标右键选中需要复制的图层(快捷方式:上面勾选自动选择),接着一只手按住Alt键,另一只手点击鼠标左键(不松开),往左往右移动即可.若是对多个图层起作用,就可将需 ...
- Go 里面的 ^ 和 &^
这几天在研究 Go 的源码,突然发现了一个之前没有见过的位运算,见这里 new &^= mutexWoken & 和 ^,分别表示 AND 和 XOR,这个不用多说. 值得一提的是 ^ ...
- CCF201312-2ISBN号码
问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如"x-xxx-xxxxx-x",其中符号"-&qu ...
- vue和react给我的感受
以下纯属个人使用两个框架的感想和体会: 不知道你们是否有这种感觉~ 我vue和react都用过一段时间,但是vue给我感觉就是经常会忘记语法,需要对照文档才知道怎么写( 难不成是我没喝六个核桃的原因吗 ...
- vscode快速生成html的基本代码
转载自:https://blog.csdn.net/suwyer/article/details/81237880 在vscode里新建html文件, 总是要一行一行的写标准的html代码: 而DW新 ...
- 记录Jenkins升级到最新版遇到的问题
首先吐槽一下Jenkins: 1.安装插件的时候无法根据Jenkins的版本号安装对应的插件! 2.安装插件安装版本不一致的时候无法降低插件版本! 3.为啥要我们升级到最新版! 一.升级原因 我的 ...
- Druid 1.1.24 在控制台打印"discard long time none received connection. , jdbcUrl : jdbc:mysql://...."错误日志
Druid 1.1.24 在控制台打印"discard long time none received connection. , jdbcUrl : jdbc:mysql://...&qu ...
- MySQL存储引擎、基础数据类型、约束条件
MySQL存储引擎 存储引擎 # 存储引擎可以堪称是处理数据的不同方式 # 查看存储引擎的方式 show engines; # 需要掌握的四个存储引擎 MyISAM MySQL5.5之前的默认的存储引 ...