课程起源

有一次在工作中编写python工具时,遇到一个 问题:从配置文件读取变量A后,无法在内存中把A的值改变成新的内容。为了解决“更新内存中变量”的这个问题,查找了一些帖子,结果发现了有个很简单的方便 -- 使用global关键字!

2 global关键字

官方对global关键字的作用说明如下:

global关键字用来在函数或其他局部作用域中使用全局变量。

不好理解没事,先上传一段简单的代码:

  1. x = 1
  2. def func():
  3. print(x)
  4. func()
  5. 结果是:1

虽然func函数里并没有传入x的值,但是在函数内打印变量x时,是按照函数内的局部变量 -> 全局变量。由于func()中没有局部变量x,因此就读取了全局变量的x=1。因此最后 打印的结果是1

       那么如果我加上局部变量x =2 ,那结果如下:

  1. x = 1
  2. def func():
  3. x =2
  4. print(x)
  5. func()
  6. print(x)
  7. 结果是:
  8. 2
  9. 1

函数内如果如何对x进行操作变化,都无法改变函数外的x值。这也就是我工作中遇到的问题简化版。

       为了解决这个问题,我们 需要学习下global关键字。

  1. x = 1
  2. def func():
  3. global x
  4. x =2
  5. print(x)
  6. func()
  7. print(x)
  8. 结果是:
  9. 2
  10. 2

只需要在func()加上global x声明,就可以把局部变量x=2变成全局变量,即改变了x在内存中的值。对应上述示例代码,第一个2是func内部打印的,第2个2是func外部打印的。
      因此,简单来说 ,global关键字定义的变量,无论在哪里变化,都可以直接改变内存中的值。

3 nonlocal关键字

其实一开始我并不知道有nonlocal这个关键字,但是许多大神的帖子都提到了这个函数,那我当然学习下!官方对 nonlocal作用的定义如下:

nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。

先来一段示例代码:

  1. x = 1
  2. def func():
  3. nonlocal x
  4. x =2
  5. print(x)
  6. func()
  7. print(x)
  8. 结果代码报错,SyntaxError: no binding for nonlocal 'x' found

为什么我只是把global换 成了nonlocal,却报错了?因为nonlocal是用于函数中的函数。

  1. x = 1
  2. def func():
  3. x = 2
  4. def subfunc():
  5. nonlocal x
  6. x = x + 1
  7. print('subfunc内打印的值:%d' % x)
  8. return x
  9. print('func内打印的值:%d' % x)
  10. return subfunc
  11. func()
  12. print('func外打印的值:%d' % x)
  13. 结果是:
  14. func内打印的值:2
  15. func外打印的值:1

nonlocal关键字既没有改变全局变量x=1的值,也没有改变局部变量x=2的值。这就是指nonlocal声明的变量不是局部变量,也不是全局变量。

示例代码在func()里加了一个子函数subfunc(),但是从结果来看,似乎并没有执行subfunc()。这是为什么呢?因为我们只调用了func(),如果要调用subfunc()的话,要func()()

  1. x = 1
  2. def func():
  3. x = 2
  4. def subfunc():
  5. nonlocal x
  6. x = x + 1
  7. print('subfunc内打印的值:%d' % x)
  8. return x
  9. print('func内打印的值:%d' % x)
  10. return subfunc
  11. def func2():
  12. # 为了方便使用func()(),用变量F表示func()
  13. F = func()
  14. print('func2内第一次打印:%d' % F())
  15. print('func2内第二次打印:%d' % F())
  16. func2()
  17. 结果是:
  18. func内打印的值:2
  19. subfunc内打印的值:3
  20. func2内第一次打印:3
  21. subfunc内打印的值:4
  22. func2内第二次打印:4

从这段代码可以看到,subfunc()里的x变量从原来的2变成了3,所以nonlocal是改变了subfunc()子函数内的变量值,即外部嵌套函数内的变量。

因此,简单地理解,被nonlocal定义后的变量,只会在被调用的子函数中起作用。

课堂总结

个人理解来看,global比较有实际用途,而且使用简单,建议掌握。

(如果有什么建议和诉求,可以通过下面的留言区反馈,知无不言,一起学习!)

作者:华为云合作开发者

【Python成长之路】python 基础篇 -- global/nonlocal关键字使用的更多相关文章

  1. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  2. python成长之路第三篇(1)_初识函数

    目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...

  3. python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-has ...

  4. Python成长之路【第二篇】Python基础之数据类型

    阅读目录 简介 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字(整形,长整形,浮点型 ...

  5. python成长之路【第九篇】:网络编程

    一.套接字 1.1.套接字套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Commun ...

  6. python成长之路【第二篇】:列表和元组

    1.数据结构数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence) ...

  7. python成长之路【第一篇】:python简介和入门

    一.Python简介 Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言. 二.安装python windows: 1.下载安装包 https://www.pyt ...

  8. python成长之路第三篇(3)_内置函数及生成器迭代器

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.lambda表达式 2.map内置函数 3.filter内置函数 4.reduce内置函数 5.yield生成器 ...

  9. python成长之路第三篇(2)_正则表达式

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表 ...

随机推荐

  1. CSPS模拟 73

    被T3坑了 忘记考虑$atan$只会返回正数导致无法区分方向相反模长相等的两个向量 直接把向量拆成ab两个上三角函数干出来就对了 真的exhausted

  2. 吉利WA数

  3. [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL

    此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper支持.net framework4.6.1及 ...

  4. pdf2eps implement

    Well, I used the command pdftops in the LaTeX distribution such as MiKTeX/TeXLive/CTex to implement ...

  5. Django 项目笔记

    Django 环境的搭建 Django 安装 pip install django==2.1.4 Django 创建项目 django-admin startproject mysite Django ...

  6. 领扣(LeetCode)两数之和II - 输入有序数组 个人题解

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  7. IBM-X3850-4U诊断面板信息

    IBM X3850 4U 指示灯 描述 OVERSPEC 没有足够的电量为系统供电.NONRED和LOG指示灯可能也点亮 PS 一个电源故障或者被电源未插 LINK 保留 CPU CPU出现故障.丢失 ...

  8. 关于手机微信端ios的input不能选中问题解决方案

    最近在做一个微信端的商城,以前做web端的比较多,手机端做的相对来说要少点,老板说让我用俗称”靠谱的移动前端框架”—-AUI来搭建项目. 当时觉得用不用框架无所谓啦.结果后来写到一半把项目发布到手机上 ...

  9. 并行模式之Master-Worker模式

    并行模式之Master-Worker模式 一).Master-Worker模式 作用: 将一个大任务分解成若干个小任务,分发给多个子线程执行. 注: 将大任务分解成小任务,小任务的实现逻辑要相同. 二 ...

  10. CentOS7中安装MariaDB

    什么是mariaDB? 在线安装(慢的要命) RPM离线安装(CentOS7.X) 在线安装 打开官方网站 https://mariadb.org/ 点击Download,跳转到下一页面 继续点击Do ...