文档章节

零基础学python-16.7 nonlocal介绍

raylee2015
 raylee2015
发布于 2015/09/17 16:41
字数 517
阅读 10
收藏 0

这一章节我们来讨论一些nonlocal

1.nonlocal简介

nonlocal与global相似,但是它只是作用于嵌套作用域,而且只是作用在函数里面

>>> def test():
	x=1
	print("test:"+str(x))
	def test2():
		nonlocal x
		x=3
		print("test2:"+str(x))
	class a:
		nonlocal x
		x=5
		print("a:"+str(x))
		def a1():
			nonlocal x
			x=7
			print("a.a1:"+str(x))
	test2()
	a.a1()
	print("test:"+str(x))

	
>>> test()
test:1
a:5
test2:3
a.a1:7
test:7

从上面的代码可以得出前面的结论,大家也许会注意到,test里面有个class,而且它里面的nonlocal x起作用了,是不是相违背?

不是,因为它的最外层是def

我们给一个更加直接的代码:

>>> def test():
	x=1
	print("test:"+str(x))
	#def test2():
	#	nonlocal x
	#	x=3
	#	print("test2:"+str(x))
	class a:
		nonlocal x
		x=5
		print("a:"+str(x))
		def a1():
			nonlocal x
			x=7
			print("a.a1:"+str(x))
	#test2()
	a()
	print("test:"+str(x))

	
>>> test()
test:1
a:5
test:5
>>>

我们注释了一部分代码,而且不知道a里面的a1,这个时候我们看见,nonlocal也是起作用的


但是有一点需要注意的地方:(也是global与nonlocal的区别)

global可以从嵌套的作用域开始执行,但是nonlocal所声明的变量必须已经存在,不然会报错

>>> def test():
	global x

	
>>> def test():
	nonlocal x
	
SyntaxError: no binding for nonlocal 'x' found
>>>

2.应用

nonlocal主要用于修改外层函数的变量

看下面代码:

>>> def test():
	x=1
	print("test:"+str(x))
	def test2():
		#nonlocal x
		x=3
		print("test2:"+str(x))
	test2()
	return x

>>> test()
test:1
test2:3
1
>>>

如果没使用nonlocal,x是不会改变的

>>> def test():
	x=1
	print("test:"+str(x))
	def test2():
		nonlocal x
		x=3
		print("test2:"+str(x))
	test2()
	return x

>>> test()
test:1
test2:3
3


但是使用了nonlocal声明x,x在test2执行后,已经改变了状态


总结:这一章节主要讲述了nonlocal是什么,还讲述了nonlocal的简单应用


这一章节就说到这里,谢谢大家

------------------------------------------------------------------

点击跳转零基础学python-目录



版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/raylee2007/article/details/48465839

raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
私信 提问
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
05/26
62
0
第22天:Python NameSpace&Scope

by 潮汐 命名空间定义了在某个作用域内变量名和绑定值之间的对应关系,命名空间是键值对的集合,变量名与值是一一对应关系。作用域定义了命名空间中的变量能够在多大范围内起作用。 命名空间...

纯洁的微笑
09/27
0
0
Python基础总结成千行代码,让Python入门更简单!

只要学会这千行代码,不管你是零基础还是弱基础或是没有接触过编程,都可以快速入门Python!当时我就不信邪啊,等我看完之后,即使作为一个Python老鸟了,还是领会到了很多教授他的独特见解!...

糖宝lsh
2018/09/10
260
0
家里断网好无聊,正好最近学了Python来破解下邻居的WiFi试试!

家里WiFi没网了,贼无聊,正好隔壁几家的邻居都出去玩了,偷偷的破解他们的WiFi用用应该不要紧的~ Python是我刚学的,破解WiFi也是临时想法,不过Python的学习资料一大把是真的!一个刚从培训...

Python小哥哥
2018/09/08
0
0
Python 2 和 Python 3 主要区别有哪些(一)?

Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》 你可能从来没有听说...

liuzhijun
2017/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部