学习记录-Python的局部变量和全局变量
1 定义
- 在被调用函数内赋值的变量是局部变量
- 在所有函数之外赋值的变量是局部变量
当一个函数被调用的时候,就会创建一个局部作用域,在这个函数内的所有变量都存在于该局部作用域内(global的变量除外),该函数返回时,这个局部作用域被销毁,这个局部作用域内的局部变量随之丢失
2 作用域的重要性
- 全局作用域中的代码不能使用任何局部变量
- 局部作用域中的代码可以访问全局变量
- 一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量
- 在不同的作用域中,可以使用相同的名字命名不同的变量
下面根据具体代码举例说明
2.1 全局作用域中的代码不能使用任何局部变量
def spam():
egg = 'this is in function spam'
spam()
print(egg)
在函数spam()
(局部作用域)中给egg赋值,然后在全局作用域中调用函数spam()
运行后显示,egg未被定义
egg是局部变量,而print(egg)
中的变量egg是全局变量,全局作用域中的代码不能使用局部作用域中的变量
这一点我理解为:在调用子函数spam()
时,创建了一个局部作用域,并在局部作用域中定义了一个局部变量,当子函数调用结束后,局部作用域和内部定义的局部变量一起没销毁,因此在全局作用域中,找不到egg这个局部变量
2.2 局部作用域中的代码可以访问全局变量
def spam():
print(egg)
egg = 'Outside the function'
spam()
全局变量在声明或赋值时被创建,直到程序被终止或执行结束
如果在egg赋值前调用函数
def spam():
print(egg)
spam()
egg = 'Outside the function'
这时候会显示变量未被定义
2.3 不同局部作用域中的变量不能相互调用
def spam():
print(egg)
def init():
egg = 'this is in init funcion'
init()
spam()
2.4 在不同的作用域中,可以使用相同的名字命名不同的变量
def spam():
egg = 'this is in spam function'
print(egg)
def init():
egg = 'this is in init funcion'
print(egg)
#egg = 'Out side function'
#print(egg)
init()
spam()
两个子函数中都定义了变量egg,但在打印时,互不影响
3 全局变量与局部变量同名
在上面说到,可以在局部作用域中调用全局变量,并且在给出的例子中,我们的子函数中只有一个print操作,但如果一个变量既在全局作用域中定义,又在局部作用域中定义,那么会出现什么样的打印结果
def spam():
egg = 'this is in spam function'
print(egg)
def init():
egg = 'this is in init funcion'
print(egg)
egg = 'Out side function'
print(egg)
init()
spam()
这里我的理解是:在局部作用域要对一个变量进行操作,Python会先在当前局部作用域查找有没有声明这个变量,如果有,就优先使用当前局部作用域中的变量,如果当前局部作用域作用域中没有,才会去全局作用域中寻找
4 global
global允许在局部作用域中声明全局变量
def spam():
global egg
egg = 'In spam function'
spam()
print(egg)
通过使用global语句在局部作用域中声明了一个全局变量egg,当函数spam()
调用结束后变量egg并未随之销毁
5 全局变量和局部变量的优先级
在上面的例子中说过,如果在全局变量和局部变量同名,那么局部作用域中会优先处理在当前作用域中声明的的变量
用下面的例子进一步说明这个问题
def spam():
print(egg)
egg = 'In spam function'
egg = 'Out side function'
spam()
报错显示局部变量在赋值前被引用
,就像前面所说,当在局部作用域中处理一个变量时,Python会先查看这个变量是否在局部作用域中进行声明,然后在会在全局作用域中查找这个变量的声明
参考内容
《Python编程快速上手》
最新文章
- ORA-12541:TNS:no listener 客户端tnsnames.ora配置,以及服务端listener.ora配置
- Kubernetes deployed on multiple ubuntu nodes
- POI 读取word (word 2003 和 word 2007) (转)
- Linux高级编程--06.进程概述
- Nginx架构的企业级应用
- K-Anonymous Sequence(poj 3709)
- linux 正则表达式深度解析
- 实现一个servlet的helloworld小程序(不适用Eclipse)
- python的数与字符串
- 使用 Windows Media Center 远程控制
- VMware vSphere服务器虚拟化实验六 vCenter Server 添加储存
- Struts2国际化信息机制
- 分布式进阶(三)Ubuntu 14.04 之JDK安装
- 构建apache web 服务器
- C_使用clock()函数获取程序执行时间
- 《生命》第四集:Fish (鱼类)
- python 中的列表List
- 弱引用(WeakReference)
- (原)Show, Attend and Translate: Unsupervised Image Translation with Self-Regularization and Attention
- 各平台免费翻译API
热门文章
- 算法竞赛进阶指南0x33同余
- 简单的数据结构_via牛客网
- word-break,word-wrap,line-break相关知识
- Go语言基础三:基本数据类型和运算符
- 2539-SpringSecurity系列--在有安全验证的情况下做单元测试Test
- mysql grant命令
- 使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
- Java学习(二)Dos
- http、https和Cookie
- Blazor和Vue对比学习(知识点杂锦3.04):Blazor中C#和JS互操作(超长文)