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. 函 ...
随机推荐
- 顺利通过EMC实验(4)
- js 图片上传给后台的3种格式
1. file格式 (创建formData来完成file上传) 我们的接口需求: 代码: <input type="file" id="imgfile" ...
- Promise原理实现(一):前置知识点
实现promise首先需要了解如下知识点: 1: 高阶函数 (一个函数作为另外一个函数的参数,这个包含的函数就是高阶函数): outer是一个高阶函数,inner函数作为一个参数传递:此处也是闭包 ...
- 百度离线人脸识别sdk的使用
1.1下载sdk运行 百度离线人脸识别sdk的使用 1.2配置环境 添加至项目,可以拖动复制或者以类库形式添加face-resource此文件夹 放到根目录上一层 激活文件与所有dll引用放到根目录嫌 ...
- linux磁盘概述
硬盘简史 世界上第一块硬盘出生在1956年,至今已有61年半个多世纪的历史.它由IBM公司制造,世界上第一块硬盘:350RAMAC.盘片直径为24英寸,盘片数为50片,重量则是上百公斤,相当于两个冰箱 ...
- 前台js发请求参数与后台接参数的问题
js函数中写参数,ajax中写参数,示例如下: function informationQuery(sign){//预警详情条件查询 $.get("/detail/informationQu ...
- Linux内核链表之共享双链表
说明 共享双链表意义在于,可以用一套函数维护不同数据类型的双链表 准备 定义双链表 #include <iostream> #include <string> using na ...
- 动手动脑3&课堂作业(四则运算与继承)
先上结果 Java程序会先把所有的静态模块提取出来优先执行 四则运算主程序代码 1 import java.util.Scanner; 2 3 4 public class main { 5 publ ...
- 随机获取gbr颜色值
- 使用etcd选举sdk实践master/slave故障转移
本次将记录[利用etcd选主sdk实践master/slave高可用], 并利用etcdctl原生脚本验证选主sdk的工作原理. master/slave高可用集群 本文目标 在异地多机房部署节点,s ...