python的函数(二):作用域
我们在写函数时,时常需要引用全局的变量,或对全局变量赋值。又或者偶尔遇到局部变量与全局变量同名。在处理这些问题时,python语言的游戏规则是怎样的?今天我们就来学习这方面的内容。
什么是作用域?
在python语言里,在函数内部定义的变量,仅在函数内有效。在函数外面定义的变量对全局有效。我们把这种变量的有效范围叫作变量的作用域。
在python语言里,当引用变量时,会按照由内向外、由近及远的找查变量的定义及赋值。例如下面的代码:
a=1
deffunc():
b=a
c=a
当执行到b = a时,
第一步,会先在函数内部查找变量a。
第二步,如果第一步没有找到,会继续向外、向上查找。在这里就是查找函数外部,查找函数定义之前的代码,找到a = 1。(如果第一步查找到了a的定义,就忽略第二步。)
当执行到c = a时,向上跳过func(),直接找到a = 1。就是说会跳过同级的函数。也就是说,函数内的变量只对本函数有效,对外部没有影响。
三段代码对比
#示例一:函数内部
a=1
deffunc_a():
a=2
deffunc_b():
a=3
print(a)
func_b()
func_a()#打印结果3
#示例二:向上一级
a=1
deffunc_a():
a=2
deffunc_b():
print(a)
func_b()
func_a()#打印结果2
#示例三:全局
a=1
deffunc_a():
deffunc_b():
print(a)
func_b()
func_a()#打印结果1
global和nonlocal是干什么的?
从上面的代码来看,python会自动按照由里向外、由近及远的规则查找变量。来看下面的几段代码。
#示例一:func_b不能修改func_a里的变量
a=1
deffunc_a():
a=2
deffunc_b():
a=3
func_b()
print(a)
func_a()#打印结果仍然是2
#示例二:func_b修改了func_a里的变量
a=1
deffunc_a():
a=2
deffunc_b():
nonlocala
a=3
func_b()
print(a)
func_a()#打印结果3
#示例三:func_b修改了全局变量,而不影响func_a内部的变量
a=1
deffunc_a():
a=2
deffunc_b():
globala
a=3
func_b()
print(a)
func_a()#打印结果仍然是2
print(a)#打印结果3
所以,当需要修改外部变量的值时global和nonlocal是必需的。一般建议是不管是引用还是修改,都使用global和nonlocal。
for循环没有单独的作用域
for内部定义的变量在循环结束后变量仍然有效。如:
foriin range(3):
a=i
print(a)#打印结果2
总结
简单总结一下变量作用域的规则:
由内向外、由近及远。
可直接引用外部变量、全局变量(建议使用nonlocal和global)。
当需要修改外部变量和全局变量时必需使用nonlocal和global来定义。
预告
下一次,我们学习函数的参数传递。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- elastic search 修改日志级别为warn
- prometheus学习笔记(3)-使用exporter监控mysql
- elasticsearch query里面的slop选项
- 彻底明白Android设计模式—(动态)代理模式
- elastic search 如何将yellow 状态变为green健康状态
- All clients has disconnected from. You can graceful shutdown now., dubbo version: , current host
- Failed to instantiate org.mybatis.spring.SqlSessionTemplate Constructor threw exception
- 护网之Linux应急处理操作手册
- 对新版安全狗学习
- redis key的删除策略及LRU的实现
- 护网Linux应急处置操作手册-Tools篇
- 加密,编码三问
- 我是怎么挖掘yii2反序列化0day的
- yii2反序列化后续
- 线程基础三问——猫眼真题