在python中,一个函数就是一个作用域

name = 'xiaoyafei'

def change_name():
name = 'sthu'
print('在change_name里的name:',name) change_name() # 调用函数
print("在外面的name:",name)

运行结果如下:

在change_name里的name: sthu
在外面的name: xiaoyafei

我们再试一下在嵌套函数中是如何的寻找的?

age = 15
def func():
print('第一层age:',age) # 第一层age: 15 def func2():
age = 73
print("func2中的age:",age) # func2中的age: 73 def func3():
age = 84
print("func3中的age:",age) # func3中的age: 84 func3() # 调用func3函数 func2() # 调用func2函数 func()

在以上嵌套函数中,就能够很好的说明一个函数就是一个作用域,那么我们现在稍微改一下代码看看情况?

age = 15
def func():
print('第一层age:',age) # 第一层age: 15 def func2():
print("func2中的age:",age) # func2中的age: 15 # 看到没有,如果当前作用域里没有age变量,那么它就会往上找 def func3():
age = 84
print("func3中的age:",age) # func3中的age: 84 func3() # 调用func3函数 func2() # 调用func2函数 func()

那么,这时候有人就说了,屁话一大堆讲的原来是局部变量和全局变量,那么我想问:在上面这个嵌套函数中,func2中并没有age变量,那么它是如何找到全局变量age = 15的?

此时我们就需要来看一下作用域的查找顺序了:

变量作用域LEGB

  • L:locals 函数内的名称空间,包括局部变量和实参
  • E:enclosing 外部嵌套函数的名称空间,即相邻的上一层,打个比方说:func2中没有age变量则会去func里找这个
  • G:globals 全局变量
  • B:builtins 内置模块的名称空间

咳咳,还是先了解下什么是名称空间把?

名称空间,又名name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,x = 1 ,1存放在内存当中,那么变量名x存放在哪里呢?名称空间就是存放名字x与1绑定关系的地方

>>> x = 1
>>> id(1)
1576430608

名称空间分为以下3种:

  • locals: 是函数内的名称空间,包括局部变量和形参
  • globals: 全局变量,函数定义所在模块的名字空间
  • builtins: 内置模块的名字空间

不同变量的作用域不同就是有这个变量所在的命名空间决定的.

作用域即范围

  • 全局范围:全局存活,全局有效
  • 局部范围:临时存货,局部有效

让我们来举例看一下

level = 'L0'
n = 22 def func():
level = 'L1'
n = 33
print(locals()) # {'n': 33, 'level': 'L1'} 在之前说过在python中,一个函数就是一个作用域,这就很完美的体现了 def outer():
n = 44
level = 'L2'
print(locals(),n) # {'level': 'L2', 'n': 44} 44 def inner():
level = 'L3'
print(locals(),n) # {'level': 'L3', 'n': 44} 44
inner()
outer() func()

以 L --> E --> G -->B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置函数中找。

最新文章

  1. PHP HTTP请求
  2. java良好的编码习惯
  3. Servlet中的常用类以及常用方法
  4. Zabbix(一)--zabbix 2.4.8 安装
  5. iOS Build Setting证书设置
  6. python函数,lambda表达式,三目运算,列表解析,递归
  7. 数独Sudoku
  8. jquery显示隐藏toggle
  9. PHP 定时任务|Cron
  10. Investigation of Different Nets and Layers
  11. MFC--自定义消息
  12. hdu2389(HK算法)
  13. zstu 4214 高楼扔鸡蛋(google 面试题)dp
  14. java数据结构之链表的实现
  15. FastReport.NET 中使用二维码
  16. bootstrap select多选
  17. Android 框架 Afinal使用
  18. python自动类型转换(针对于Number数据类型来的)精度从低到高 bool->int-> float->complex 当两个不同是数据类型运算时候,默认想更高进度转化
  19. GUI_文件管理器(练习)
  20. Python中的文件IO操作(读写文件、追加文件)

热门文章

  1. 使用dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行
  2. c# Dictionary字典类如何使用
  3. 1072. Gas Station (30) 多源最短路
  4. Exception in thread "main" java.lang.UnsupportedClassVersionError: com/crack
  5. table tr列 鼠标经过时更改背景颜色
  6. error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
  7. 【洛谷】P1892 团伙(并查集)+ 求助
  8. [OpenCV Qt教程] 如何在内存中压缩图像
  9. python删除安装的模块
  10. git之项目上传