nonlocal和global
获取变量时遵循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的更多相关文章
- 函数的嵌套+nonlocal和global关键字(重点)
1.在函数中声明函数 在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置 # 函数的互相调用 # def func1(): # pri ...
- python3中的nonlocal 与 global
nonlocal 与 global nonlocal翻译是非本地,global翻译是全局,它们都是python3的新特性.如果以类C语言的思维去看这2个关键字,很可能觉得它们差不多.但实际上它们很不一 ...
- python3 nonlocal vs global
考虑这样一个python程序: x = 12 def func(): x = 1 func() print(x) 输出为:x = 12 因为函数内部定义的x被认为只属于局部作用域,为了表明我么引用的是 ...
- [转]nonlocal和global
在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local).嵌套作用域(Enclosing function locals).全局作用域(Global).内置作用域(bui ...
- Python nonlocal 与 global 关键字解析
nonlocal 首先,要明确 nonlocal 关键字是定义在闭包里面的.请看以下代码: x = 0 def outer(): x = 1 def inner(): x = 2 print(&quo ...
- [TimLinux] Python nonlocal和global的作用
1. 执行代码 以下实例都是通过执行以下代码,需要把以下执行代码放在后面实例代码的后面. a = outer_func()print("call a()") a() a() a() ...
- Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链
命名空间 -------‘’存放名字与值的关系”的空间 代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间: 在函数的运行中开辟的临时的空间叫做局部命名空间. 命名空间一共分为三种: ...
- python 函数动态参数,名称空间,global,nonlocal
##################################总结######################################动态参数 *args:位置参数动态传参,接收到的是元 ...
- glob.glob()、os.path.split()函数、global和nonlocal关键字
1. glob.glob() glob模块是Python最简单的模块之一, 内容非常少, 用它可以查找符合特定规则的文件路径名, 查找文件时只会用到三个匹配符: * :匹配0个或多个字符 ? : 匹配 ...
随机推荐
- apache kafka系列之在zookeeper中存储结构
1.topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 Schema: { "version": ...
- Mosaic 前端微服务框架
Mosaic 是一系列的服务.库,集成在一起,定义了组件如何彼此交互,可以用来支持大规模的web 站点开发 一张架构图 说明 尽管上图中的一些组件已经迭代演化了(skipper 的route 配置,上 ...
- python Console menu
I just finished a demo which is to provide an easy way to control hardware resources of A sample. Th ...
- Java Runnable与Callable区别
接口定义 #Callable接口 public interface Callable<V> { V call() throws Exception; } #Runnable接口 publi ...
- i++和++i的笔试题
i = ++i + i++ + i++ + i++; 把每个 i++或者++i看作一个部分,他们的分别再下一个 i++或者++i改变,中途赋值的话,就返回这个部分的值 来自:https://www.j ...
- java程序控制
一.软件生命周期 什么是软件: 软件是程序员根据需求用计算机的语言去编写一系列的指令的集合,能让计算机快速去自动执行.1.1做市场调研----->调研报告书 ======项目经理 1.2可行性分 ...
- 如何编译运行HanLP自然语言处理包
master分支 对于master分支,编译方法如下: git clone https://github.com/hankcs/HanLP.git mvn install -DskipTests · ...
- 排序算法<No.1> 【计数排序】
继上篇博文,今天我将先介绍一下什么是计数排序,将计数排序描述清楚后,再进行后续的桶排序方法解决这个问题. 通常情况下,一提到排序,大家第一反应就是比较,其实,今天我要说的这个计数排序,不是基于比较的排 ...
- MySQL 快速构造一亿条记录的表
在上一次朋友问我如何快速构造一亿条记录的表后,我理出了实行的办法,见:http://blog.csdn.net/mchdba/article/details/52938114,但是因为录入一亿表需要2 ...
- C#中winform使用相对路径读取文件的方法
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73b6cd0d3027fa3cf1fd579080101 ...