名称空间

名称空间就是变量名与变量值绑定关系的地方。比如对于x=1,1存放于内存空间,而x与1的对应关系存储在名称空间中。

名称空间分为三类:内置名称空间、全局名称空间、局部名称空间。

内置名称空间

内置名称空间存储的是python解释器提前给我们定义好的,像len()、print()、open()等。

存活周期:python解释器运行则产生,关闭则销毁。

全局名称空间

名字只要不是在函数里的运行产生的,都会存到全局名称空间。

  1. name = 'jason' # 变量名name存入全局名称空间
  2. def index(): # 函数名index存入全局名称空间
  3. pass
  4. if True:
  5. a = 111 # 变量名a存入全局名称空间
  6. for i in range(10): # 变量名i存入全局名称空间
  7. pass
  8. while True:
  9. b = 222 # 变量名b存入全局名称空间

存活周期:python文件开始运行时产生,运行完毕时销毁。

局部名称空间

名字只要是在函数里的运行产生的,都会存到局部名称空间。

  1. def index():
  2. name = 'jason' # 变量名name存入局部名称空间

存活周期:函数被调用时产生,函数调用结束时销毁。

名称的查找顺序

如果要去找一个名称,有这么多个名称空间,我们该去那个名称空间找呢?

在查找名称之前,要先知道直接在哪一个空间内。知道了自己所在的空间后,先在自己空间内查找,找不到在向外寻找,所以查找顺序应该是:局部名称空间 >>> 全局名称空间 >>> 内置名称空间

  1. # 案例一
  2. len = '我是全局名称空间中的len'
  3. def index():
  4. len = '我是局部名称空间中的len'
  5. print(len) # 输出:我是局部名称空间中的len
  6. index() # 调用函数 函数体就会执行 就会产生局部名称空间
  7. print(len) # 输出:我是全局名称空间中的len
  8. # 案例二
  9. x = 111
  10. def f1():
  11. x = 222
  12. def f2():
  13. x = 333
  14. print(x)
  15. f2()
  16. f1() # 输出:333

作用域

作用域就是名称空间能够作用的范围,按照名字作用范围的不同可以将三个名称空间划分为两个区域:

  • 全局作用域:全局存活,全局有效,内置名称空间和全局名称空间就是处于全局范围的。
  • 局部作用域:临时存活,局部有效,局部名称空间就是处于局部范围的。

global关键字

那么问题来了,我们该如何在局部内修改全局的名称的值呢?

如果全局名称空间中的名称是可变类型:

  1. l = [1, 2, 3]
  2. def index():
  3. l.append(4)
  4. index()
  5. print(l) # 输出:[1, 2, 3, 4]

如果全局名称空间中的名称是不可变类型:

  1. x = 100
  2. def index():
  3. global x # 使用关键字声明,说明之后的x使用的是全局的x
  4. x = 200
  5. index()
  6. print(x) # 输出:200
  7. """如果想要在局部名称空间中修改全局名称空间中的名字 那么需要使用关键字global申明"""

nonlocal关键字

问题又来了,知道了怎么在局部名称空间中修改全局名称空间中的名字,那么局部名称空间有多层嵌套该如何修改外层的名字呢?

比如:

  1. def index():
  2. x = 100
  3. def f():
  4. # 如何在f()函数里修改x的值?
  5. f()
  6. print(x)

同样,这个时候也是需要一个关键字,这个关键字就是nonlocal。

  1. def index():
  2. x = 100
  3. def f():
  4. nonlocal x # 使用nonlocal关键字,说明之后的x使用的是外层的x
  5. x = 200
  6. f()
  7. print(x) # 输出:200

函数名的多种用法

用法一:函数名当做变量名赋值

  1. def index():
  2. print('来自函数index')
  3. res = index # 让res也指向index指向的函数体代码
  4. res() # 相当于执行了index()
  5. # 输出:来自函数index

用法二:函数名当函数的实参

  1. def index():
  2. print('来自函数index')
  3. def func(a):
  4. a()
  5. func(index) # 实参index传给形参a,func函数内部的a()变成了index()
  6. # 输出:来自函数index

用法三:函数名当做函数的返回值

  1. def func():
  2. return index # 将函数名当做返回值
  3. def index():
  4. print('来自函数index')
  5. res = func() # res接收函数名index
  6. res() # 相当于执行了index()
  7. # 输出:来自函数index

用法4:函数名作为容器类型的元素

  1. def index():
  2. print('来自函数index')
  3. l1 = [1, 2, 3, index]
  4. l1[-1]() # 相当于执行了index()
  5. # 输出:来自函数index

函数的嵌套

函数的嵌套其实就与if、while、for循环的嵌套一样,这里只做简单展示。

  1. # 函数嵌套死循环
  2. def index():
  3. func()
  4. print('来自index')
  5. def func():
  6. index()
  7. print('来自func')
  8. func()

python之名称空间与函数对象的更多相关文章

  1. Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...

  2. Python(名称空间、函数嵌套、函数对象)

    一.名称空间: 名称空间 定义:存放名字和值的绑定关系       内置名称空间 python自带的名字,如print.int.str 解释器启动就会生效   全局名称空间 文件级别定义的名字,都会放 ...

  3. python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  4. day 23 对象的名称空间 类,对象属性和方法 封装 接口提供

    一.对象的特有名称空间 # 对象独有的名称空间:在产生对象时就赋初值 '''class ted: def func(): 当func里不存在参数时,调用时不需要给值 print('hah')ted.f ...

  5. Python 的名称空间和作用域

    最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...

  6. python之名称空间

    1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类的数据属性是共享给所有对象 print(id(g1.c ...

  7. Python基础—名称空间(Day10)

    一.名称空间和作用域 1.全局名称空间(名称空间.命名空间): py文件运行时代码从上之下依次执行,看到一个变量就会将这个变量与对应值的内存地址的关系存到名称空间里,代码要运行时(print时)从名称 ...

  8. python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域

    一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...

  9. python基础之函数参数,名称空间,以及函数嵌套

    函数进阶内容梗概: 1. 函数参数--动态传参 2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序. 3. 函数的嵌套 4. gloabal , nonlocal 关键字 1. 函 ...

随机推荐

  1. SQL之总结(四)---null问题的处理

    概述:如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录.这意味着该字段将以 NULL 值保存. NULL 值的处理方式与其他值不同. NULL 用作未知的或不适 ...

  2. 移动端——touch事件

    1.touchstart 当手指触碰屏幕时候触发 dom.addEventListener('touchstart',function(e){}); startX=e.touches[0].clien ...

  3. java中如何打印规定图案? 举例说明

    9.4 print out the following pattern(打印图案). * *** ***** ******* ***** *** * 提示: 1)本题上面的图案和下面的图案是一样的.所 ...

  4. PAT B1015德才论

    题目描述: 宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不 ...

  5. route -n 讲解

    我们经常会出现临时添加路由,或者是路由重启路由丢失等导致网络不通的情况,上网查发现很多介绍或者没有实验跟进导致理解的时候很费劲的情况,可能人家认为是比较简单的事情了,但是很多不尽然,老手也不一定能很快 ...

  6. Linux磁盘分区fdisk命令操作(简洁版)

    实例(环境为: CentOS Linux release 7.2.1511 (Core), 3.10.0-327.el7.x86_64) 选择要具体操作的第二块磁盘(linux下一切是文件形式对应): ...

  7. Java三大结构

    Java三大结构 顺序结构(基本结构) 选择结构 循环结构 1. 顺序结构 平时一般语句都默认遵循顺序结构 2. 选择结构 2.1 if单选择结构 语法 if(布尔表达式){ //布尔表达式为true ...

  8. Python 每日提醒写博客小程序,使用pywin32、bs4库

    死循环延迟调用方法,使用bs4库检索博客首页文章的日期是否与今天日期匹配,不匹配则说明今天没写文章,调用pywin32库进行弹窗提醒我写博客.

  9. Git上传本地仓库文件到Gitee(Github同理)

    前言:本来想把最近的代码更新到Github上,但是校园网打不开,于是决定暂时先更新到Gitee中,Github中的操作也同理. 1. 创建云仓库: 就是在Gitee/Github上创建仓库,这里不演示 ...

  10. OpenHarmony标准设备应用开发(三)——分布式数据管理

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 邢碌 上一章,我们通过分布式音乐播放器.分布式炸弹.分布式购物车,带大家讲解了 OpenAtom OpenHarmon ...