知识点:

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. Flex colorTranfrom使用说明

    这次使用colorTranfrom主要用来将一个已有的过渡颜色映射到其他颜色条.发现这个colorTranfrom很好使用,于是简单研究了下 文档有说明: 使用 ColorTransform 类调整显 ...

  2. Windows Mobile 6开发环境搭建

    Windows Mobile 6开发环境搭建 本文主要介绍在已有的Visual Studio 2005和Microsoft SQL Server2008环境基础上,如何搭建Windows Mobile ...

  3. iOS敏捷开发之道,经常使用的宏定义总结

    iOS开发中,直接在pch文件里导入宏定义. 在做项目的时候,直接拿过来使用,能够大幅度提高开发速度. 以下是 个人总结的一些宏定义. 假设大家有其它的经常使用的宏定义.欢迎加入.我会定期更新这个bl ...

  4. sscanf()的用法

    头文件 #include 定义函数 int sscanf (const char *str,const char * format,........); 函数说明             sscanf ...

  5. Scrapy爬虫入门系列4抓取豆瓣Top250电影数据

    豆瓣有些电影页面需要登录才能查看. 目录 [隐藏]  1 创建工程 2 定义Item 3 编写爬虫(Spider) 4 存储数据 5 配置文件 6 艺搜参考 创建工程 scrapy startproj ...

  6. 我的第四个程序 java实现加减乘除

    import java.util.Scanner; public class Test { public static void main(String [] args) { Scanner sc = ...

  7. jvm(12)-java内存模型与线程

    [0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识:   [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计 ...

  8. Android开发:使用DialogFragment实现dialog自定义布局

    使用DialogFragment实现dialog的自定义布局最大的好处是可以更好控制dialog的生命周期. TestFragment的代码: public class TestFragment ex ...

  9. 48、ViewFlow ---- 滑动广告页

    <!-- main.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  10. hfut 1287

    http://acm.hfut.edu.cn/OnlineJudge/ 中文题. 区间线段树,需要剪枝.n的大小有问题. #include <iostream> #include < ...