python3中的nonlocal 与 global
nonlocal 与 global
nonlocal翻译是非本地,global翻译是全局,它们都是python3的新特性。如果以类C语言的思维去看这2个关键字,很可能觉得它们差不多。但实际上它们很不一样。
下面先说说global。顾名思义,global能将一个变量提升为全局, 但是这个关键字有个特别的语法要求,即不能同时定义和声明,如global a=1。
a = 1
def func():
print(a)
global a
a += 2
# SyntaxWarning: name 'a' is used prior to global declaration
func() #输出1
print(a) #输出3
不熟悉python的可能会举得上面的global有点多余,可能会倾向于下面这种写法:
a = 1
def func():
a += 2
func()
print(a)
可惜这么写只会报错UnboundLocalError: local variable 'a' referenced before assignment, 具体原因可以参考https://www.cnblogs.com/friedCoder/p/12571983.html
这种类C写法不能照搬到Python中,毕竟python是解释型语言,两者不可完全类比。
对于global再补充最后一个小点
def func():
global a
a = 1
print(a) #NameError: global name 'a' is not defined
def func():
global a
a = 1
func()
print(a) #输出1
可以发现python竟然还能直接在函数里面定义外部的全局变量,当然没有global是做不到的,不过这种写法很不好。
下面再来看看nonlocal
既然已经有一个处理全局的关键字了,那nonlocal就是一个处理局部变量的关键字。
a = 1
def outer():
a = 2
def inner():
print(a)
nonlocal a
a = 3
inner()
print(a)
outer()
print(a)
发现执行报错SyntaxError: name 'a' is used prior to nonlocal declaration, 因为函数inner里面a在声明nonlocal之前就被print调用了,这是不允许的, global一样。
a = 1
def outer():
a = 2
def inner():
nonlocal a
a = 3
inner()
print(a) #3
outer()
print(a) #1
可见nonlocal就是能引用外部环境的局部变量,遵守最近原则。
注意这里强调局部变量,下面都是不允许的:
a = 1
def outer():
def inner():
nonlocal a
a = 3
inner()
print(a)
outer()
####################################
def outer():
global a
def inner():
nonlocal a
a = 3
inner()
print(a)
outer()
报错SyntaxError: no binding for nonlocal 'a' found
从上面可以看出python中修改外部变量挺麻烦的,因此最好使用面向对象的编程方法,而非面向过程。
python3中的nonlocal 与 global的更多相关文章
- 第九天python3 闭包、nonlocal、默认值的作用域
闭包 自由变量:未在本地作用域中定义的变量,例如定义在内存函数外的外层函数的作用域中的变量: 闭包:出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成了闭包: 示例1: # -*- c ...
- Python3中变量作用域nonlocal的总结
最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑.今天趁周六休息总结记录一下. 众所周知,Python中最常见的作用域定义如下: 但是,为了更加方便地在闭包函数 ...
- Python3中的新特性(1)——新的语言特性
1.源代码编码和标识符 Python3假定源代码使用UTF-8编码.另外,关于标识符中哪些字符是合法的规则也放宽了.特别是,标识符可以包含代码点为U+0080及以上的任意有效Unico ...
- 函数的嵌套+nonlocal和global关键字(重点)
1.在函数中声明函数 在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置 # 函数的互相调用 # def func1(): # pri ...
- 关于Python3中函数:
# 关于Python3中函数: - 定义 定义函数使用关键字def,后接函数名和放在圆括号()中的可选参数列表,函数内容以冒号起始并且缩进.一般格式如下:``` def 函数名(参数列表): &quo ...
- Python3中的字符串函数学习总结
这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...
- Python3中使用PyMySQL连接Mysql
Python3中使用PyMySQL连接Mysql 在Python2中连接Mysql数据库用的是MySQLdb,在Python3中连接Mysql数据库用的是PyMySQL,因为MySQLdb不支持Pyt ...
- python3 中mlpy模块安装 出现 failed with error code 1的决绝办法(其他模块也可用本方法)
在python3 中安装其它模块时经常出现 failed with error code 1等状况,使的安装无法进行.而解决这个问题又非常麻烦. 接下来以mlpy为例,介绍一种解决此类安装问题的办法. ...
- python3中返回字典的键
我在看<父与子的编程之旅>的时候,有段代码是随机画100个矩形,矩形的大小,线条的粗细,颜色都是随机的,代码如下, import pygame,sys,random from pygame ...
随机推荐
- StormDRPC流程解读
Storm 的编程模型是一个有向无环图,模型角度决定了 Storm 的 Spout 接收到外部系统的请求,将请求数据分发给下游的 bolt 进行处理后,spout 并不能得到 bolt 的处理结果并将 ...
- rem - 移动前端自适应适配布局解决方案和比较(转载)
原文链接:http://caibaojian.com/mobile-responsive-example.html 互联网上的自适应方案到底有几种呢?就我个人实践所知,有这么几种方案:· 固定一个某些 ...
- 「每天五分钟,玩转 JVM」:对象访问定位
前言 在「对象内存布局」一节中,我们了解到对象头中包含了一个叫做类型指针的东西,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.但是,并不是所有的虚拟机都是这么去做的.不 ...
- 聊一聊 React 中的 CSS 样式方案
和 Angular,Vue 不同,React 并没有如何在 React 中书写样式的官方方案,依靠的是社区众多的方案.社区中提供的方案有很多,例如 CSS Modules,styled-compone ...
- EOS基础全家桶(一)开篇
简介 从今天开始我会在FishoPark上与大家分享EOS的一些技术经验和基础,如果大家在看文章的过程中有任何问题,欢迎在网站下方的评论里留言,我会尽力为大家解答,如果发现我内容中所写有错,欢迎指正, ...
- hdu1548 奇怪的电梯 dfs dijkstra bfs都可以,在此奉上dfs
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/5706/ 简单的规定深度进行搜索,代码如下: #include<bits/stdc++.h> usin ...
- redhat7安装
------------恢复内容开始------------ 新建虚拟机向导(自定义) 指定虚拟机安装位置,把他放在固态硬盘提升他的运行速度(不推荐,一般将位置定为非系统盘) 选择系统镜像文件 开机选 ...
- 【2019牛客暑期多校第三场】J题LRU management
题目链接 题意 好吧,这道题我其实看都没看过,队友跟我说了说这道题是模拟题,卡时间.然后我就上了-- 大致就是维护一个线性表,然后有两种操作:插入.查询 插入时,如果这个值(string)之前出现过, ...
- 使用 NLTK 对文本进行清洗,索引工具
使用 NLTK 对文本进行清洗,索引工具 EN_WHITELIST = '0123456789abcdefghijklmnopqrstuvwxyz ' # space is included in w ...
- 面试刷题27:程序员如何防护java界的新冠肺炎?
背景 安全是软件设计的第二个非功能性需求,一般是当软件出现安全问题的时候才会得到重视. 最明显的比如 数据库用户信息和密码泄漏等: 数据加解密技术 单向加密 md5+salt值, 这个是软件设计中使用 ...