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个或多个字符 ? : 匹配 ...
随机推荐
- CSVN部署安装,实现web管理svn
系统环境:centos7最小化安装 下载这个文件并解压 https://pan.baidu.com/s/1miwdBc8 tar zxvf jdk-8u91-linux-x64.gz mv jdk1. ...
- MySQL--时间戳属性1
============================================================================== DATETIME类型和TIMESTAMP类 ...
- 22 初始模块 random time collections functools
一 .初始模块 1.从⼩到⼤的顺序: ⼀条代码 < 语句块 < 代码块(函数, 类) < 模块 2.引入模块的方式 ① import 模块 ② from 模块 im ...
- Zabbix-2.4-安装-2
zabbix自定义报警-动作 打开资产自动接收 这里看到主机资产有数据了,这里的数据,就是来自下面的关联 上面的数据就是设置login-user时候设置的关联 有些关联显示的慢,比如下面 ...
- redhat 6.4下PXE+Kickstart无人值守安装操作系统
一 前言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装.常规的办法有什么?1.光盘安装系统:每个服务器DVD内置光 ...
- [ERROR] InnoDB: ibdata1 different size (rounded down to MB)
启动mysql实例报错,查看 error log ## 错误信息2018-08-31T10:38:36.945081Z 0 [ERROR] InnoDB: The Auto-extending inn ...
- react-router v4 实现路由拦截的一种思路(待验证)
出处:https://segmentfault.com/q/1010000010905474
- MOSSE(DSST)类和KCF类中滤波器推导结果不一致的解释
首先要说明,DSST//BMVC2014类的CF是从MOSSE//CVPR2010模型得到的,是从信号的角度考虑问题,该类CF直接认为信号和滤波器之间存在相关的关系 而KCF//TPAMI2015类C ...
- spring-IOC容器(三)
一.通过工厂方法配置Bean: .xml <!-- class属性:指向静态工厂方法的全类名 factory-method:指向静态工厂方法的名字 constructor-arg:如果工厂方法需 ...
- jstack实战死循环与死锁学习笔记
一.实战死循环导致CPU飙高 top -p pid -H jstack pid printf "%s" 十进制的线程id 二.创建CUP100%实例(死循环) 1.创建CpuCo ...