获取变量时遵循LEGB原则,
修改变量时需要global/nonlocal进行修改

global

# global的使用
函数外定义了全局变量: global关键字在函数内会修改全局变量 函数外没定义全局变量: global会在函数内定义全局变量(不管是几层闭包, 只要调用了就会定义)

nonlocal

.修改当前作用域上一级(局部变量)
.如果上一级也没有, 就继续向上
.再找不到, 就会报错(不会到全局变量中寻找)
 def outer():
a = 1
def inner():
# nonlocal a
a += 5 # UnboundLocalError: local variable 'a' referenced before assignment
# 此处为修改操作, 需要用nonlocal声明才可以进行
print(a)
return inner() outer()

可变数据类型不用global声明也可以更改的情况:

 li = [1, 2, 3]
print(li, id(li)) # [1, 2, 3] 2661565497032 def func():
# 修改了li的元素, 但是并没有修改li这个变量所指向的地址
li[1] = 55
print(li, id(li)) # [1, 55, 3] 2661565497032 func()
print(li, id(li)) # [1, 55, 3] 2661565497032

删除局部变量, 不会再向全局中寻找的情况

 def func():
a = 2
del a
print(a) func()
# UnboundLocalError: local variable 'a' referenced before assignment
# 函数内的a有标志位, 已经记录删除a变量过后, 不会在向外部寻找a变量

内层函数对全局变量的操作修改还是赋值

 dic = {'a':1}
def func():
# 可以修改dic元素内容
dic[1] = 2
# 此操作为修改dic变量, 不是赋值dic变量,
# 从上到下已经记录定义了dic为全局变量
# 需要用到global才可以修改
dic = 1 func()
# UnboundLocalError: local variable 'dic' referenced before assignment

注意事项:

 def func():
a = 10
def inner():
nonlocal a
a = 5 # 这个是nonloca声明修改外部函数的a变量
a = 10 # 这次是给inner函数增加了个a的局部变量

nonlocal和global的更多相关文章

  1. 函数的嵌套+nonlocal和global关键字(重点)

    1.在函数中声明函数 在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置 # 函数的互相调用 # def func1(): # pri ...

  2. python3中的nonlocal 与 global

    nonlocal 与 global nonlocal翻译是非本地,global翻译是全局,它们都是python3的新特性.如果以类C语言的思维去看这2个关键字,很可能觉得它们差不多.但实际上它们很不一 ...

  3. python3 nonlocal vs global

    考虑这样一个python程序: x = 12 def func(): x = 1 func() print(x) 输出为:x = 12 因为函数内部定义的x被认为只属于局部作用域,为了表明我么引用的是 ...

  4. [转]nonlocal和global

    在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local).嵌套作用域(Enclosing function locals).全局作用域(Global).内置作用域(bui ...

  5. Python nonlocal 与 global 关键字解析

    nonlocal 首先,要明确 nonlocal 关键字是定义在闭包里面的.请看以下代码: x = 0 def outer(): x = 1 def inner(): x = 2 print(&quo ...

  6. [TimLinux] Python nonlocal和global的作用

    1. 执行代码 以下实例都是通过执行以下代码,需要把以下执行代码放在后面实例代码的后面. a = outer_func()print("call a()") a() a() a() ...

  7. Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链

    命名空间 -------‘’存放名字与值的关系”的空间 代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间: 在函数的运行中开辟的临时的空间叫做局部命名空间. 命名空间一共分为三种: ...

  8. python 函数动态参数,名称空间,global,nonlocal

    ##################################总结######################################动态参数 *args:位置参数动态传参,接收到的是元 ...

  9. glob.glob()、os.path.split()函数、global和nonlocal关键字

    1. glob.glob() glob模块是Python最简单的模块之一, 内容非常少, 用它可以查找符合特定规则的文件路径名, 查找文件时只会用到三个匹配符: * :匹配0个或多个字符 ? : 匹配 ...

随机推荐

  1. apache kafka系列之在zookeeper中存储结构

    1.topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 Schema:   {    "version": ...

  2. Mosaic 前端微服务框架

    Mosaic 是一系列的服务.库,集成在一起,定义了组件如何彼此交互,可以用来支持大规模的web 站点开发 一张架构图 说明 尽管上图中的一些组件已经迭代演化了(skipper 的route 配置,上 ...

  3. python Console menu

    I just finished a demo which is to provide an easy way to control hardware resources of A sample. Th ...

  4. Java Runnable与Callable区别

    接口定义 #Callable接口 public interface Callable<V> { V call() throws Exception; } #Runnable接口 publi ...

  5. i++和++i的笔试题

    i = ++i + i++ + i++ + i++; 把每个 i++或者++i看作一个部分,他们的分别再下一个 i++或者++i改变,中途赋值的话,就返回这个部分的值 来自:https://www.j ...

  6. java程序控制

    一.软件生命周期 什么是软件: 软件是程序员根据需求用计算机的语言去编写一系列的指令的集合,能让计算机快速去自动执行.1.1做市场调研----->调研报告书 ======项目经理 1.2可行性分 ...

  7. 如何编译运行HanLP自然语言处理包

    master分支 对于master分支,编译方法如下: git clone  https://github.com/hankcs/HanLP.git mvn install -DskipTests · ...

  8. 排序算法<No.1> 【计数排序】

    继上篇博文,今天我将先介绍一下什么是计数排序,将计数排序描述清楚后,再进行后续的桶排序方法解决这个问题. 通常情况下,一提到排序,大家第一反应就是比较,其实,今天我要说的这个计数排序,不是基于比较的排 ...

  9. MySQL 快速构造一亿条记录的表

    在上一次朋友问我如何快速构造一亿条记录的表后,我理出了实行的办法,见:http://blog.csdn.net/mchdba/article/details/52938114,但是因为录入一亿表需要2 ...

  10. C#中winform使用相对路径读取文件的方法

    http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73b6cd0d3027fa3cf1fd579080101 ...