【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成长之路】python 基础篇 -- global/nonlocal关键字使用的更多相关文章
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- python成长之路第三篇(1)_初识函数
目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...
- python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作
打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-has ...
- Python成长之路【第二篇】Python基础之数据类型
阅读目录 简介 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字(整形,长整形,浮点型 ...
- python成长之路【第九篇】:网络编程
一.套接字 1.1.套接字套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Commun ...
- python成长之路【第二篇】:列表和元组
1.数据结构数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence) ...
- python成长之路【第一篇】:python简介和入门
一.Python简介 Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言. 二.安装python windows: 1.下载安装包 https://www.pyt ...
- python成长之路第三篇(3)_内置函数及生成器迭代器
打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.lambda表达式 2.map内置函数 3.filter内置函数 4.reduce内置函数 5.yield生成器 ...
- python成长之路第三篇(2)_正则表达式
打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表 ...
随机推荐
- [考试反思]1109csp-s模拟测试107:低能
诶一看这不是水题AK场吗?然后80分钟就拿到了285分. 然后,对拍?还是卡T2常数?还是想T2正解? 于是上述三项我依次进行了. 前两项让我的分数丝毫不变但是吃掉了我一个多小时的时间. 卡常卡的也不 ...
- 用js给元素增加链接
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- 列转行pivot函数在SQL Sever里面和Oracle里面的用法区别
首先pivot是一个列转行的函数,反向用是unpivot(行转列). 在SQL sever中可以这么写 SELECT * FROM [TABLE] /*数据源*/ AS A PIVOT ( MAX/* ...
- 05-商品类别数据和VUE展示
一.商品类别数据和VUE展示 1.商品类别数据接口 将商品类别数据展示出来,视图(views.py)代码如下: class CategoryViewset(mixins.ListModelMixin, ...
- python 抓取youtube教程
前言: 相信大家很多人都看过youtube网站上的视频,网站上有很多的优质视频,清晰度也非常的高,看到喜欢的想要下载到本地,虽然也有很多方法,但是肯定没有python 来的快, 废话不多说,上代码: ...
- Elasticsearch系列---常见搜索方式与聚合分析
概要 本篇主要介绍常见的6种搜索方式.聚合分析语法,基本是上机实战,可以和关系型数据库作对比,如果之前了解关系型数据库,那本篇只需要了解搜索和聚合的语法规则就可以了. 搜索响应报文 以上篇建立的mus ...
- Elasticsearch系列---简单入门实战
概要 本篇主要介绍一下Elasticsearch Document的数据格式,在Java应用程序.关系型数据库建模的对比,介绍在Kibana平台编写Restful API完成基本的集群状态查询,Doc ...
- Python 之路 Day01 笔记-什么是变量,常量等
变量 变量 是 为了存储 程序运算过程中的一些中间 结果,为了方便日后调用 变量的命名规则 1. 要具有描述性 2. 变量名只能'_','数字','字母'组成,不可以是空格或特殊字符(#?<., ...
- Mint UI Example的运行
Mint -UI是新推出的移动端UI框架 官网 不过官网上的文档例子不是很全面. 建议下载他们提供的example来学习. 1.examplle源码下载地址 2.打开项目,我这里使用webstorm, ...
- websrom编译器
webstorm less环境配置 备注: 安装node后,在命令行输入npm install -g less 即可安装less,打开webstorm setting-Tools-FileWatche ...