【Python成长之路】python 基础篇 -- global/nonlocal关键字使用
1 课程起源
有一次在工作中编写python工具时,遇到一个 问题:从配置文件读取变量A后,无法在内存中把A的值改变成新的内容。为了解决“更新内存中变量”的这个问题,查找了一些帖子,结果发现了有个很简单的方便 -- 使用global关键字!
2 global关键字
官方对global关键字的作用说明如下:
global关键字用来在函数或其他局部作用域中使用全局变量。
不好理解没事,先上传一段简单的代码:
x = 1
def func():
print(x)
func()
结果是:1
虽然func函数里并没有传入x的值,但是在函数内打印变量x时,是按照函数内的局部变量 -> 全局变量。由于func()中没有局部变量x,因此就读取了全局变量的x=1。因此最后 打印的结果是1
那么如果我加上局部变量x =2 ,那结果如下:
x = 1
def func():
x =2
print(x)
func()
print(x)
结果是:
2
1
函数内如果如何对x进行操作变化,都无法改变函数外的x值。这也就是我工作中遇到的问题简化版。
为了解决这个问题,我们 需要学习下global关键字。
x = 1
def func():
global x
x =2
print(x)
func()
print(x)
结果是:
2
2
只需要在func()加上global x声明,就可以把局部变量x=2变成全局变量,即改变了x在内存中的值。对应上述示例代码,第一个2是func内部打印的,第2个2是func外部打印的。
因此,简单来说 ,global关键字定义的变量,无论在哪里变化,都可以直接改变内存中的值。
3 nonlocal关键字
其实一开始我并不知道有nonlocal这个关键字,但是许多大神的帖子都提到了这个函数,那我当然学习下!官方对 nonlocal作用的定义如下:
nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。
先来一段示例代码:
x = 1
def func():
nonlocal x
x =2
print(x)
func()
print(x)
结果代码报错,SyntaxError: no binding for nonlocal 'x' found
为什么我只是把global换 成了nonlocal,却报错了?因为nonlocal是用于函数中的函数。
x = 1
def func():
x = 2
def subfunc():
nonlocal x
x = x + 1
print('subfunc内打印的值:%d' % x)
return x
print('func内打印的值:%d' % x)
return subfunc
func()
print('func外打印的值:%d' % x)
结果是:
func内打印的值:2
func外打印的值:1
nonlocal关键字既没有改变全局变量x=1的值,也没有改变局部变量x=2的值。这就是指nonlocal声明的变量不是局部变量,也不是全局变量。
示例代码在func()里加了一个子函数subfunc(),但是从结果来看,似乎并没有执行subfunc()。这是为什么呢?因为我们只调用了func(),如果要调用subfunc()的话,要func()()。
x = 1
def func():
x = 2
def subfunc():
nonlocal x
x = x + 1
print('subfunc内打印的值:%d' % x)
return x
print('func内打印的值:%d' % x)
return subfunc
def func2():
# 为了方便使用func()(),用变量F表示func()
F = func()
print('func2内第一次打印:%d' % F())
print('func2内第二次打印:%d' % F())
func2()
结果是:
func内打印的值:2
subfunc内打印的值:3
func2内第一次打印:3
subfunc内打印的值:4
func2内第二次打印:4
从这段代码可以看到,subfunc()里的x变量从原来的2变成了3,所以nonlocal是改变了subfunc()子函数内的变量值,即外部嵌套函数内的变量。
因此,简单地理解,被nonlocal定义后的变量,只会在被调用的子函数中起作用。
4 课堂总结
个人理解来看,global比较有实际用途,而且使用简单,建议掌握。
(如果有什么建议和诉求,可以通过下面的留言区反馈,知无不言,一起学习!)
作者:华为云合作开发者
相关文章
- python flask debug_pycharm配置debug
- Python基础09-装饰器
- 如何在pycharm中安装pygame_python安装pycharm的方法
- python的内置函数(五)、endswith()
- Python中字符串的Format用法。
- python 常见问答题
- java与python-如何对比Python和Java,只需三分钟告诉你!
- Python 3.x | 史上最详解的 导入(import)「建议收藏」
- python全局变量赋值_Python全局变量和局部变量[通俗易懂]
- Python基础常见面试题总结[通俗易懂]
- Python入门与基础刷题篇(7)
- python turtle 表白_pythonturtle背景颜色
- python实现手写数字识别(小白入门)「建议收藏」
- python的datetime模块的实用功能
- Python-基础-循环语句快速入门
- Python 基础篇(三)
- 新手学Python可行吗?需要什么基础?(新手学python可行吗?需要什么基础)
- 登上GitHub热榜的Python可视化工具:PyGWalker
- Python基础语法-基本数据类型-列表的方法
- Python基础语法-基本数据类型-集合的运算
- Python多任务多线程任务管理类详解编程语言
- 快速查询MySQL数据库:Python篇(python查询mysql数据库)
- 使用 attrs 来告别 Python 中的样板
- Python与Linux:开启互联网信息技术时代(python和linux)
- python插入排序算法的实现代码