如何组建网站开发团队,wordpress取摘要,wordpress防止被镜像,创意网名大全在编程中#xff0c;只要接触过函数的#xff0c;我相信都理解什么是全局变量和局部变量#xff0c;概念比较简单#xff0c;这里就不做解释了。在python中#xff0c;用global语句就能将变量定义为全局变量#xff0c;但是最近又发现有个nonlocal#xff0c;一时搞不太…在编程中只要接触过函数的我相信都理解什么是全局变量和局部变量概念比较简单这里就不做解释了。在python中用global语句就能将变量定义为全局变量但是最近又发现有个nonlocal一时搞不太清楚仔细琢磨之后才搞明白。
首先看看官方文档里面是怎么说的 global 语句是作用于整个当前代码块的声明。 它意味着所列出的标识符将被解读为全局变量。 nonlocal语句会使得所列出的名称指向之前在最近的包含作用域中绑定的除全局变量以外的变量。 注意划重点了global就是全局变量这没有问题。至于nonlocal“之前”、”最近“和“除全局变量以外”就是最核心的地方接下来用一个例子说明一下。
下面的示例代码同样来自官方文档
def scope_test():def do_local():spam local spamdef do_nonlocal():nonlocal spamspam nonlocal spamdef do_global():global spamspam global spamspam test spamdo_local()print(After local assignment:, spam)do_nonlocal()print(After nonlocal assignment:, spam)do_global()print(After global assignment:, spam)scope_test()
print(In global scope:, spam)我们可以看到这是定义了一个scope_test()然后它里面又分别定义了三个函数do_local()、do_nonlocal()和do_global()。
输出的结果是什么呢感兴趣的同学先自己琢磨琢磨我放一张图提示一下 下面正式揭晓答案了输出结果为高亮忽视掉
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam我们观察四个print函数首先do_local()里面的spam是局部变量local这是毫无疑问的所以它是不能改变spam的内容的调用它之后因为之前spamtest spam了所以输出为仍然为After local assignment: test spam。
然后do_nonlocal()里面的 spam因为有nonlocal进行修饰它的作用范围就不是局部了那是哪里呢正如文档中提到的“指向之前在最近的包含作用域中绑定的除全局变量以外的变量”在调用do_nonlocal()时哪个之前的spam离它最近呢很明显是spamtest spam这一个所以这个spam就变为了spam nonlocal spam后面输出自然就是“After nonlocal assignment: nonlocal spam”。
为了加深理解我们看看如果把spam test spam搬到函数外面会怎么样。
spam test spamdef scope_test():def do_local():spam local spamdef do_nonlocal():nonlocal spamspam nonlocal spamdef do_global():global spamspam global spamdo_local()print(After local assignment:, spam)do_nonlocal()print(After nonlocal assignment:, spam)do_global()print(After global assignment:, spam)scope_test()
print(In global scope:, spam)此时会报错 File ipython-input-1-3e4be319dd22, line 7nonlocal spam^
SyntaxError: no binding for nonlocal spam found这就充分说明了nonlocal是不能指向全局变量的。
接着do_global()里面的spam很明显就是全局变量对它进行赋值spam global spam是对全局变量赋值。那影响print(After global assignment:, spam)吗不影响因为这句print中的spam是最开始spam test spam中的那个它被do_nonlocal()赋值为“nonlocal spam”注意它可不是全局变量因为在函数scope_test()中。所以说此spam非彼spam一个是全局变量另一个虽然相对于小函数来说是非局部变量但毕竟也是大函数的局部变量呀所以第三个print自然为“After global assignment: nonlocal spam”。
那到了最后就简单了因为调用完了函数scope_test()里面只有do_global()改变了全局变量spam global spam所以自然最后输出“In global scope: global spam。
总结来说全局变量global其实是个绝对概念一旦使用就会在整个代码文件适用而local和nonlocal无非是相对概念就好像我们每个人自己可能都是学生local活到老学到老只不过相对其他人来说有的人是老师非学生nonlocal而已。
希望这篇文章能帮助大家理解。