知识点:

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. PILE读书笔记_标准I/O

    在学习和分析标准I/O库的同时, 可以重点与Linux的I/O系统调用进行比较. stdin. stdout和stderr都是FILE类型的文件指针, 是由C库静态定义的, 直接与文件描述符0. 1和 ...

  2. Django学习之模板标签和变量

    safe过滤器和{% autoescape %}标签 首先看这样一个例子: views.py中: c = '<h3>更上一层楼</h3>' render(request,'te ...

  3. 李洪强iOS开发之OC[005] - OC和C的差异学习二

  4. vue 声明响应式属性

    声明响应式属性 由于vue不允许动态添加根级响应式属性,所以你必须在初始化实例前声明根级响应式属性,哪怕只是一个空值: var vm = new Vue({ data: { // 声明 message ...

  5. error: memcached support requires ZLIB. Use --with-zlib-dir=<DIR> to specify the prefix where ZLIB

    yum install zlib-devel

  6. Ecshop提示Only variables should be passed by reference in错误

    Ecshop是个坑爹货,为什么tiandi会说它是个坑爹货呢,请看一下下面的官方的运行环境推荐: 服务器端运行环境推荐·php版本5.0以上5.3以下的版本(推荐使用5.2系列版本)·Mysql版本5 ...

  7. Spring读取配置文件的方式总结

    一.基于XML配置的方式 1.使用 PropertyPlaceholderConfigurer - 在 applicationContext.xml 中配置: <context:property ...

  8. eclipse启动不起来,eclipse.ini配置问题(支持大内存64bit问题)

    Eclipse 启动不起来异常:JVM terminated. Exit code=-1 Eclipse 启动不起来,出现以下错误: JVM terminated. Exit code=-1-Xms4 ...

  9. struts.xml文件:

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

  10. POJ2947 DAZE [Gauss]

    题目是要求建立一个方程组: (mat[1][1]*x[1] + mat[1][2]*x[2] + - + mat[1][n]*x[n])%7 =mat[1][n+1] (mat[2][1]*x[1] ...