获取变量时遵循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. mysqldump命令之single-transaction

    =========================================================在mysqldump中指定single-transaction时,会使用可重复读(RE ...

  2. Singer 学习八 运行&&开发taps、targets (三 开发tap)

    如何没有找到适合的tap,那么我们可以自己开发一个 hello world tap 仅仅是一个程序,我们可以使用任何语言进行编写,根据singer 指南,输出数据到stdout 即可,实际上一个简单的 ...

  3. 从一到无穷大:科学中的事实和臆测 (G. 伽莫夫 著)

    第一部分 做做数字游戏 第一章 大数 (已看) 第二章 自然数和人工数 (已看) 第二部分 空间,时间与爱因斯坦 第三章 空间的不寻常的性质 (已看) 第四章 四维世界 (已看) 第五章 时间和空间的 ...

  4. oracle-rman-2

    归档日志的备份 RMAN> list archivelog all;show archivelog deletion policy;configure archivelog deletion p ...

  5. [转]JDK动态代理

    代理模式         代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间 ...

  6. RSA 加密算法 Java 公钥加密私钥解密 和 私钥加密公钥解密 的特点

    package com.smt.cipher.unsymmetry; import org.apache.commons.codec.binary.Base64; import org.apache. ...

  7. C编程技巧资源

    Keil C 位变量外部引用的方法 https://blog.csdn.net/zh458042230/article/details/8627604 单片机Keil C51 C语言多文件如何使用全局 ...

  8. 亚马逊aws 一个实例双网卡-两个弹性ip设置

    一个实例默认只有1个网络接口: 步骤一.创建一个新的网络接口,附加到实例. 步骤二.手动添加路由 增加两个路由表,为后续的双网关做点小准备: vim /etc/iproute2/rt_tables 添 ...

  9. ML: 聚类算法R包-K中心点聚类

    K-medodis与K-means比较相似,但是K-medoids和K-means是有区别的,不一样的地方在于中心点的选取,在K-means中,我们将中心点取为当前cluster中所有数据点的平均值, ...

  10. Redis几种数据类型的应用场景(转)

    原文地址:https://blog.csdn.net/xiaoliuliu2050/article/details/73250708