1 定义

  • 在被调用函数内赋值的变量是局部变量
  • 所有函数之外赋值的变量是局部变量

当一个函数被调用的时候,就会创建一个局部作用域,在这个函数内的所有变量都存在于该局部作用域内(global的变量除外),该函数返回时,这个局部作用域被销毁,这个局部作用域内的局部变量随之丢失

2 作用域的重要性

  1. 全局作用域中的代码不能使用任何局部变量
  2. 局部作用域中的代码可以访问全局变量
  3. 一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量
  4. 在不同的作用域中,可以使用相同的名字命名不同的变量

下面根据具体代码举例说明

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编程快速上手》

最新文章

  1. ORA-12541:TNS:no listener 客户端tnsnames.ora配置,以及服务端listener.ora配置
  2. Kubernetes deployed on multiple ubuntu nodes
  3. POI 读取word (word 2003 和 word 2007) (转)
  4. Linux高级编程--06.进程概述
  5. Nginx架构的企业级应用
  6. K-Anonymous Sequence(poj 3709)
  7. linux 正则表达式深度解析
  8. 实现一个servlet的helloworld小程序(不适用Eclipse)
  9. python的数与字符串
  10. 使用 Windows Media Center 远程控制
  11. VMware vSphere服务器虚拟化实验六 vCenter Server 添加储存
  12. Struts2国际化信息机制
  13. 分布式进阶(三)Ubuntu 14.04 之JDK安装
  14. 构建apache web 服务器
  15. C_使用clock()函数获取程序执行时间
  16. 《生命》第四集:Fish (鱼类)
  17. python 中的列表List
  18. 弱引用(WeakReference)
  19. (原)Show, Attend and Translate: Unsupervised Image Translation with Self-Regularization and Attention
  20. 各平台免费翻译API

热门文章

  1. 算法竞赛进阶指南0x33同余
  2. 简单的数据结构_via牛客网
  3. word-break,word-wrap,line-break相关知识
  4. Go语言基础三:基本数据类型和运算符
  5. 2539-SpringSecurity系列--在有安全验证的情况下做单元测试Test
  6. mysql grant命令
  7. 使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
  8. Java学习(二)Dos
  9. http、https和Cookie
  10. Blazor和Vue对比学习(知识点杂锦3.04):Blazor中C#和JS互操作(超长文)