函数内部的函数只能在函数内部调用,不能在函数外部调用,通过接下来的学习你将会知道为什么会出现这种情况。

def f1():def f2():print('from f2')f2()f2()  # NameError: name 'f2' is not defined

一、名称空间

名称空间(name spaces):在内存管理那一章节时,我们曾说到变量的创建其实就是在内存中开辟了一个新的空间。但是我们一直在回避变量名的存储,其实在内存中有一块内存空间存储变量名与变量间的绑定关系的空间,而这个空间称为名称空间,真正存名字的地方是栈区,名称空间只是把栈区分成为几个部分,有了名称空间我们就可以在栈区存放相同的名字。


1.1 内置名称空间
内置名称空间:存放Pyhton解释器自带的名字,如int、float、len

生命周期:在解释器启动时生效,在解释器关闭时失效

1.2 全局名称空间
全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间,如下面代码中的x、func、l、z

生命周期:在文件执行时生效,在文件执行结束后失效

x = 1def func():pass l = [1, 2]if 3 > 2:if 4 > 3:z = 3

1.3 局部名称空间
局部名称空间:用于存放函数调用期间函数体产生的名字,如下面代码的f2

生命周期:在文件执行时函数调用期间时生效,在函数执行结束后失效

注意:即使是对同一个函数,即便它是空函数,如果我们对它进行多次调用的话,调用一次产生一个局部名称空间,

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def f1():def f2():print('from f2')f2()f1()


1.4 加载顺序
由于.py文件是由Python解释器打开的,因此一定是在Python解释器中的内置名称空间加载结束后,文件才开始打开,这个时候才会产生全局名称空间,但文件内有某一个函数被调用的时候,才会开始产生局部名称空间,因此名称空间的加载顺序为:内置–》全局–》局部。

1.5 查找顺序
由于名称空间是用来存放变量名与值之间的绑定关系的,所以但凡要查找名字,一定是从三者之一找到,查找顺序为:
从当前的所在位置开始查找,如果当前所在的位置为局部名称空间,则查找顺序为:局部–》全局–》内置。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
x = 1
y = 2
len = 100def func():y = 3len = 1000print(f"y: {y}")print(f"len: {len}")# print(a)  # NameError: name 'a' is not definedfunc()
Copyy: 3
len: 1000
#x = 1def func():print(x) x = 10
func()
#10

二、作用域

域指的是区域,作用域即作用的区域。

2.1 全局作用域
全局作用域:全局有效,被所有的函数共享,包含内置名称空间和全局名称空间。

# 全局作用域
x = 1def bar():print(x) bar()
#1

2.2 局部作用域
局部作用域:局部有小,临时存储,只包含局部名称空间。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 局部作用域
def f1():def f2():def f3():print(x)x = 2f3()f2()f1()
#2

2.3 注意点
需要注意的是:作用域关系在函数定义阶段就固定死了,与函数的调用无关。

# 作用域注意点
x = 1def f1():  # 定义阶段x=1print(x) def f2():x = 2f1() f2()

2.4 函数对象+作用域应用

# 作用域应用
def f1():def inner():print('from inner')return inner f = f1()  # 把局部定义的函数放在全局之中def bar():f() bar()

三、补充知识点

3.1 global关键字

修改全局作用域中的变量。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
x = 1def f1():x = 2def f2():#         global x  # 修改全局x = 3f2() f1()
print(x)
#1
#x = 1def f1():x = 2def f2():global x  # 修改全局x = 3f2() f1()
print(x)

3.2 nonlocal关键字

修改局部作用域中的变量。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
x = 1
def f1():x = 2def f2():#         nonlocal xx = 3f2()print(x)
f1()x = 1
def f1():x = 2def f2():nonlocal xx = 3f2()print(x)
f1()

3.3 注意点

  • 在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
  • 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改。
lis = [] def f1():lis.append(1)print(f"调用函数前: {lis}")
f1()
print(f"调用函数后: {lis}")
调用函数前: []
调用函数后: [1]

python基础教程:名称空间与作用域相关推荐

  1. python基础之名称空间和作用域、函数嵌套

    一.名称空间 1.定义:存放名字与值的绑定关系 2.名称空间分为:内置名称空间.全局名称空间.局部名称空间 内置名称空间:python解释器自带的名字,python解释器启动就会生成 全局名称空间:文 ...

  2. python名称空间_python基础:名称空间与作用域

    Python的变量定义后都有自己的作用域,每个作用域内都有名字空间.名称空间就是变量名称与对象的关联关系.Python中使用变量名引用对象,需要使用该变量时,就在命名空间中进行搜索,获取对应的对象.从 ...

  3. 【Python基础教程】变量的作用域详解

    变量作用域 Python 能够改变变量作用域的代码段是 def . class . lamda. if/elif/else.try/except/finally.for/while 并不能涉及变量作用 ...

  4. python之函数名称空间,作用域,嵌套函数

    目录 嵌套函数 定义 名称空间的三大类(只存变量名) 名称空间加载顺序 变量名的查找顺序为 作用域 嵌套函数 定义 函数内部定义的函数,无法在函数外部使用内部定义的函数. def f1():def f ...

  5. python 函数可以作为容器对象的元素_python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义...

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

  6. Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)

    文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...

  7. python中嵌套函数的应用实例-实例详解python函数的对象、函数嵌套、名称空间和作用域...

    函数的对象 python中一切皆对象 函数对象的四大功能 引用 def f1(): print("from f1") f1() #调用函数 print(f1) print(&quo ...

  8. Python Day 10 函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)...

    Python Day 10  函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal) 名称空间(命名空间): 当程序运行时,代码从上至下一次读取,遇到变量与值, ...

  9. python函数的全局、局部名称空间及作用域

    """ a = 1 def func(): return func() 开辟一个-全局名称空间(当前py文件),将这些对应关系储存在里面,函数是储存成func:funct ...

  10. Python 基础教程(第二版)读书笔记

    Python 基础教程(第二版) 第一章 在 Python 3 中可直接使用长整数,而不必添加 L 或者 l 的后缀. print在 Python 3 中是函数. 在交互式解释器中使用 if 语句,需 ...

最新文章

  1. L1-009 N个数求和
  2. NSArray和NSDictionary的混合
  3. 【数理逻辑】谓词逻辑 ( 个体词 | 个体域 | 谓词 | 全称量词 | 存在量词 | 谓词公式 | 习题 )
  4. gdb 调试 TuMediaService
  5. c语言发展过程,C语言发展史
  6. π-Algorithmist分类题目(2)
  7. 通过RHCE认证之路
  8. 生产环境和开发环境_生产环境 VS 开发环境,关于Kubernetes的四大认识误区
  9. 学生宿舍管理系统设计与分析
  10. 南开计算机等级,南开100题分类-全国计算机等级考试上机考试习题集(二级C)(南开大学出版社)...
  11. java 非科学计数法_Java设置大数非科学计数法显示
  12. 关于linux校准时间
  13. 融云 x OHLA:「社交+游戏」双轮驱动,逐鹿中东陌生人社交
  14. picpick尺子像素大小精度不够准确_picpick尺子像素大小精度不够准确_相机的像素精度,物理定位精度,亚像素定位之间的关系和进行像素的固定误差累积......
  15. 量子计算机关键技术有哪些,实现量子通信的关键技术有哪些?
  16. 算法设计与分析第一章作业
  17. 2020,不一样的春节假期
  18. 一文带你了解什么是数学建模
  19. html5 canvas烂漫的空中散落的花瓣动画特效
  20. iphone4能做什么,你需要iphone吗…

热门文章

  1. 深度学习笔记之使用Faster-Rcnn进行目标检测 (实践篇)
  2. video标签 添加视频
  3. NYOJ----776删除元素
  4. JavaScript的标签
  5. springMVC面试问题整理一
  6. 记一次T-SQL查询优化 索引的重要性
  7. jquery键盘事件全记录
  8. VMware View 5万点虚拟桌面项目案例详析
  9. 【学习笔记】7、标准数据类型—字符串
  10. 【学习笔记】利用Excel实现简易版大屏