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. 函 ...
随机推荐
- XShell免费版的安装配置教程以及使用教程(超级详细)
一. XShell的作用 XShell可以在Windows界面下来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的.它支持 RLOGIN.SFTP.SERIAL.TELNET.SSH2 ...
- coolshell-初见
首页:https://coolshell.cn/tag/programmer 我是怎么招聘程序员的 https://coolshell.cn/articles/1870.html 程序员需要具备的基本 ...
- mysql4与mysql5的区别_MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要区别
MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要区别 一.5.0 增加了Stored procedures.Views.Cursors.Triggers.XA transactions的 ...
- java实现sftp文件上传下载
/** * * @param filePath 文件全路径 * @param ftpPath 上传到目的端目录 * @param username * @param password * @param ...
- mount挂载命令
了解命令mount,这是一个挂载命令,挂载的意思是指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件.当在 Linux 系统中使用硬件 ...
- C++五子棋(六&七)——游戏结束
规则原理 如图 判断游戏结束 chessData.h //row,col 表示当前落子 bool checkWin(ChessData* game, int row, int col); 横.竖.斜( ...
- python中的嵌套
嵌套:将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套.既可以在列表中嵌套字典,也可以在字典中嵌套列表,甚至在字典中嵌套字典. 一.列表中嵌套字典 1)一般创建方式: student_ ...
- Msf路由转发
Msf路由转发 前言 在内网渗透中,我们拿下了一台机器A的权限,再通过A做一个跳板来做横向渗透,这时我们对于内网中的其他机器是无法连接的.我们在A上做横向渗透是很困难的,因为在这台机器一般为web服务 ...
- docker:compose安装
compose:独立于docker的程序,可以做多容器app 安装docker-compose: 下载docker-compose文件: curl -L https://github.com/dock ...
- XCTF练习题---MISC---2017_Dating_in_Singapore
XCTF练习题---MISC---2017_Dating_in_Singapore flag:HITB{CTFFUN} 解题步骤: 1.观察题目,下载附件 2.打开附件后发现是一张日历,还是新加坡的, ...