Python开发【第十二篇】python作用域和global nonlocal
2024-10-16 12:01:11
python的作用域
作用域也叫名字空间,是访问变量时查找变量名的范围空间
python中的四个作用域 LEGB
作用域 | 英文解释 | 英文缩写 |
---|---|---|
局部作用域 | Local(function) | L |
外部嵌套函数作用域 | Enclosing Function local | E |
函数定义所在模块(文件)的作用域 | Global(module) | G |
Python内建模块的作用域 | Builtin(python) | B |
示例:
# 此示例示意作用域
v = 100
def f1():
v = 200
print("f1.v=", v)
def f2():
v = 300
print("f2.v=", v)
f2()
f1()
print("v=", v)
变量名的查找规则
L ---> E ---> G ----> B
注:
在默认的情况下,变量名赋值会创建或改变当前作用域
内变量的绑定关系
global语句
作用:
告诉解释执行器,global语句声明的一个或多个变量
这些变量的作用域为模块级的作用域,也称为全局变量
全局声明(global)将赋值语句的变量映射到模块文件内部的作用域
语法:
global 变量名1
global 变量名1,变量名2,....
示例:
# 此示例示意global语句的语法和用法
v = 100
def f1():
global v # global声明v为全局变量
v = 200 # 想让此赋值语句去修改全局变量v
f1()
print('v=', v) # 200
说明:
全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是局部变量)
全局变量在函数内部不经过声明就可以直接访问(取值)
不能先创建局部变量,再用global声明为全局变量,此种做法不符合规则
global变量列表里的变量名不能出现在函数的形参列表里
nonlocal语句
作用:
告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
语法:
nonlocal 变量名1, 变量名2, ....
示例:
# 此示例示意nolocal 语句的语法和用法
v = 100
def f1():
v = 200
print("f1.v=", v)
def f2():
nonlocal v
v = 300
print("f2.v=", v)
f2()
print("f1.v=", v)
f1()
print("全局的v=", v)
说明:
nonlocal语句只能在被嵌套函数内部进行使用
对nonlocal变量进行赋值将对外部嵌套函数作用域内的变量进行操作
当有两层或者两层以上函数嵌套时,访问nonlocal变量只对最近的一层变量进行操作
nonlocal语句的变量列表里的变量名不能出现在此函数的形参列表中
def 语句的作用是创建函数
lambda 表达式(又称匿名函数)
作用:
创建一个匿名函数对象
同def 类似,但不提供函数名
语法:
lambda [函数形参列表]: 表达式
示例:
# 此示例示意lambda 表达式的语法和用法
# def myadd(x, y):
# return x + y
# 用lambda表达式来创建上面的函数
myadd = lambda x, y: x + y
print("20+30=", myadd(20, 30)) # 50
print("4 + 5 =", myadd(4, 5)) # 9
说明:
1. lambda 表达式创建的函数只能包含一条表达式
2. lambda 比函数简单,且可以随时创建和销毁,有利于
降低程序的偶合度
eval函数和exec() 函数
eval(source, global=None, local=None), 把一个
字符串source 当成一个表达式来执行,返回表达式执
行后的结果
exec(source, global=None, local=None) 把一个
字符串source当成程序来执行
最新文章
- 接触PHP快4个月
- Hibernate 缓存介绍
- Vim快捷键操作命令
- window删除文件时提示: 源文件名长度大于系统支持的长度
- SQLi filter evasion cheat sheet (MySQL)
- HDU 5753 Permutation Bo (推导 or 打表找规律)
- Linux正則表達式-反复出现的字符
- Bug 的严重性的定义参考
- 使用数据流的方式 将数据导出到指定形式到Word中 (不使用插件,很简单的一种)
- Java课程设计-定时器
- POJ - 1984 Navigation Nightmare 种类并查集
- hdu 5468(莫比乌斯+搜索)
- 在windows环境利用celery实现简单的任务队列
- MVC Scaffolding SmartCode-Engine 更新
- spark MLlib Classification and regression 学习
- Linux下批量修改后缀名
- Golang 函数
- serde
- eclipse show view失效的解决办法
- Qt Creator怎样更改默认构建目录
热门文章
- 【学习笔记】PYTHON数据分析与展示(北理工 嵩天)
- SQL注入总结
- openCV CV2用法(转)
- MAZE(2019年牛客多校第二场E题+线段树+矩阵乘法)
- JDOJ 2197: 校门外的树
- CanvasRenderingContext2D.fillText(text, x, y [, maxWidth]);
- spark基础知识一
- linux .pid文件简述
- 每日一问:讲讲 JVM 的类加载机制
- 安装goimports