知识点:

global将一个变量变为全局变量

nonlocal改变最近的变量,又不是全局作用。

1.global

在python中,当引用一个变量的时候,对这个变量的搜索按找本地作用域(Local)、嵌套作用域(Encolosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则。

m = 1    #全局
def fun1():
m = 2 #嵌套
def fun2():
m = 3 #本地
fun2()
fun1()

当在函数中给一个变量赋值的时候,python总是创建或者改变本地作用域的变量名,因此你无法在一个函数外调用函数内的变量,也无法在函数内改变一个函数外的变量。就像下面

#外层无法引用内层变量
def fun1():
k = 10
fun1()
print(k) 结果:
Traceback (most recent call last):
File "I:/untitled/cx/11月/11-17面向对象/1.属性.py", line 83, in <module>
print(k)
NameError: name 'k' is not defined #内存无法改变外层变量
k = 100
def fun1():
k = k + 50
fun1()
print(k) #结果
Traceback (most recent call last):
...
UnboundLocalError: local variable 'k' referenced before assignment

如果在函数中改变函数外的变量或者在函数外调用函数内的变量时,可以使用global。

global可以将一个变量变为全局变量。在内部改变或者在外部引用。

def fun1():
global k
k = 50
fun1()
print(k) 或者这样
k = 10
def fun1():
global k
k = 50
fun1()
print(k)

2.nonlocal

nonlocal可以在一个嵌套的函数中修改嵌套作用域中的变量,理论上是修改离它最近的变量,但不会改变全局。

#这是正常情况
def func3():
n = 1
def func4():
n = 2
def func5():
n = 5
print(n) #5
func5()
print(n) #
func4()
print(n) #
func3()

加入nonlocal之后

def func3():
n = 1
def func4():
n = 2 #最近的n = 5
def func5():
nonlocal n
n = 5
print(n) #
func5()
print(n) #
func4()
print(n) #
func3()

还可能这样:

def func3():
n = 1 #这里最近n =5
def func4():
# n = 2
def func5():
nonlocal n
n = 5
print(n) #
func5()
print(n) #5 继承func3
func4()
print(n) #
func3()

不会改变全局

n =100
def func3():
n = 1 #这里最近n =5
def func4():
def func5():
nonlocal n
n = 5
print(n) #
func5()
print(n) #5 继承func3
func4()
print(n) #
func3() #结果
5
5
5
100

python中的关键字global和nonlocal的更多相关文章

  1. Python中关键字global与nonlocal的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xCyansun/article/details/79672634终于下定决心学习Python了.既然 ...

  2. 转载 Python中关键字global与nonlocal的区别

    转载自CSDN 雁丘1990, 原文地址: https://blog.csdn.net/xcyansun/article/details/79672634 这篇文章写的很赞, 条理清晰, 分析循序渐进 ...

  3. python关键字global和nonlocal总结

    函数中使用全局变量 a = 100 b = 200 def func(): def sub(): return b return a + b + sub() 执行fun()后返回值为:500 a, b ...

  4. Python迭代器和关键字 global ,nonlocal

    1.关键字 global : 可以修改全局变量 可以在局部作用域声明一个全局变量,剪切 : 此时局部作用域没有该变量,全局作用域中有 name = 1 def func(): global name ...

  5. Python中的关键字的用法

    Python有哪些关键字 -Python常用的关键字 and, del, from, not, while, as, elif, global, or, with, assert, else, if, ...

  6. 如何查看Python中所有关键字

    一.保留字即关键字,我们不能把它们用作任何标识符名称.Python的标准库提供了一个keyword模块,可以输出当前版本的所有关键字 import keyword print(keyword.kwli ...

  7. python中super关键字的用法

    http://python.jobbole.com/86787/ class A: def __init__(self):    print "enter A"    print ...

  8. 关键字 global和nonlocal

    globale 表示从全局把一个变量(比如a)引入局部,后面的变量全是此变量a 使用   globale 变量名 # 全局变量一般是不能随意的修改的 # a = 10 # def func(): # ...

  9. python 中一些关键字的区别

    一.raw_input 和input input和raw_input都可以读取控制台的输入,但是input和raw_input在处理数字时是有区别的 1.当输入为纯数字时 input返回的是数值类型, ...

随机推荐

  1. 解决带fusionCharts的页面多次点击后不显示的问题

    问题: 假设不使用公司封装的fusioncharts.使用自己定义的.建议不要使用例如以下方法 使用$(document).ready( 页面载入完之后再载入,会导致多次点击带有fusionchart ...

  2. C++语言基础(17)-运算符重载

    运算符重载的格式为: 返回值类型 operator 运算符名称 (形参表列){ //TODO: } 一.在类里面实例运行符重载 #include <iostream> using name ...

  3. gdb 详解

    环境:gcc (OpenWrt/Linaro GCC 4.8) 以如下的简单代码为例,说明gdb的使用. void func1(int a, int b) { int c; c = a + b; } ...

  4. python C example:encode mp3 code

    #include <stdio.h> #include <stdlib.h> #include <lame.h> #define INBUFSIZE 4096 #d ...

  5. 实战Jquery(二)--能够编辑的表格

    今天实现的是一个表格的样例,通过获取表格的奇数行,设置背景色属性,使得奇偶行背景色不同.这个表格能够在单击时编辑,回车即更改为新输入的内容;ESC还原最初的文本.表格的实现思路非常清晰,仅仅是在实现的 ...

  6. hive分桶 与保存数据的方式

    创建分桶的表 create table t_buck(id int ,name string) clustered by (id ) sorted by (id) into 4 buckets  ; ...

  7. Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)

    我们知道,如果想要在Yarn上运行MapReduce作业,仅需实现一个ApplicationMaster组件即可,而MRAppMaster正是MapReduce在Yarn上ApplicationMas ...

  8. input子系统分析(转)

    转自:http://www.linuxidc.com/Linux/2011-09/43187.htm 作者:作者:YAOZHENGUO2006 Input子系统处理输入事务,任何输入设备的驱动程序都可 ...

  9. 大数据(3) - 高可用 HDFS HA

    HDFS HA高可用 1 HA概述 1)所谓HA(high available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制 ...

  10. struts.xml文件:

    struts.xml文件中包含的配置信息,你将修改所采取的措施的开发.这个文件可以被用来覆盖默认设置的应用程序,例如struts.devMode=false和其他设置中定义的属性文件.这个文件可以创建 ...