python中函数作用域
在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 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置函数中找。
python中函数作用域的更多相关文章
- 论python中的作用域
编程语言从早至今,可以分为面向过程编程.面向函数编程和面向对象编程.BASIC语言是典型的面向过程编程的语言,C语言支持面向函数编程,但不支持面向对象,JAVA只支持面向对象编程,python同时支持 ...
- python中函数的定义和详细的使用方法
1. 函数的概念,函数是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 2. 函数的作用,使用函数可以加强代码的复用性,提高程序编写的效率 3. 函数的使用,函数必须先创建才 ...
- Python中函数参数传递问题【转】
1. Python passes everything the same way, but calling it "by value" or "by reference& ...
- python中的作用域与名称空间
python中的名称空间以及作用域分析 从Python解释器开始执行之后,就在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征 ...
- 【Python】解析Python中函数的基本使用
1.简介 在Python中定义函数的基本格式为: def <函数名>(参数列表): <函数语句> return <返回值> Python中的函数形式比较灵活,声明一 ...
- python 中函数的参数
一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...
- python 中函数参数传递形式
python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...
- python中函数的参数解析
python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...
- (转)python中函数参数中如果带有默认参数list的特殊情况
在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]): for i in range(x): ...
随机推荐
- ecmall 挂件开发实例一
(参考网上相关文章,进行测试点评,下述方法测试成功) 1:在页面上添加要展示的页面模块 <div class="left" area="bottom_foot&q ...
- bzoj 4407 于神之怒加强版——反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4407 \( ans = \sum\limits_{D=1}^{min(n,m)}\frac{ ...
- python中高阶函数学习笔记
什么是高阶函数 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数 def fun(x, y, f): print f(x), f(y) fun ...
- pandas之DateFrame 数据过滤+遍历行+读写csv-txt-excel
# XLS转CSV df = pd.read_excel(r'列表.xls') df2 = pd.DataFrame()df2 = df2.append(list(df['列名']), ignore_ ...
- Zookeeper--分布式锁和消息队列
在java并发包中提供了若干锁的实现,它们是用于单个java虚拟机进程中的:而分布式锁能够在一组进程之间提供互斥机制,保证在任何时刻只有一个进程可以持有锁. 分布式环境中多个进程的锁则可以使用Zook ...
- [Java.Web][Servlet]常用请求头.断点续传
HTTP 请求头字段 Range Range 头指示服务器只传输一部分 Web 资源.这个头可以用来实现断点续传功能. Range 字段可以通过三种格式设置要传输的字节范围: Range bytes ...
- Warning: require(D:\wamp\www\glink-smart\bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in D:\wamp\www\glink-smart\bootstrap\autoload.php on line 1
Laravel访问出错错误信息:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or dire ...
- 第十二章 Ganglia监控Hadoop及Hbase集群性能(安装配置)
1 Ganglia简介 Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点.每台计算机都运行一个收集和发送度量数据(如处理器速度.内存使用量等)的名为 gm ...
- 04:Sysbench压测-innodb_flush_log_at_trx_commit,sync_binlog参数对性能的影响
目录 sysbench压测-innodb_flush_log_at_trx_commit,sync_binlog参数对性能的影响 一.OLTP测试前准备 二.MySQL 数据落盘的过程 三.参数说明 ...
- 线程的run( ) 和 start( ) 区别
Run() : run()就是个普通方法,可以调用执行,但是是同步调用,没有异步的效果. Run()方法就是个普通方法,可以调用多次 Start(): 通知线程规划期,此线程已经准备就绪,等待调用 ...