python3 nonlocal vs global
考虑这样一个python程序:
x = 12
def func():
x = 1
func()
print(x)
输出为:x = 12
因为函数内部定义的x被认为只属于局部作用域,为了表明我么引用的是全局的x而不是新定义一个局部的x,
可以使用global关键字:
x = 12
def func();
global x
x = 1
func()
print(x)
可以发现输出已经变成了1,也就是在函数内部成功修改了一个全局变量
还有一种情形,就是嵌套的局部作用域的问题:
def g():
x = 12
func():
x = 1
func()
print(x)
g()
这样输出的结果为12,因为func函数调用时定义的X也被认为只属于局部作用域了,但是此时函数g()里定义的x并非全局变量,用前述的global关键字肯定是不行的,
所以又有了nonlocal,这样写:
def g():
x = 12
func():
nonlocal x
x = 1
func()
print(x)
g()
这时,输出的结果就是我们预期的1了,nonlocal就是声明要引用一个外部作用域(全局作用域除外)中定义的变量。
需要指出的是,上述关键字之所以需要,是因为我们试图去修改全局变量或者处于外部作用域的变量,如果在局部作用域内部重定义全局变量或外部作用域变量,仅仅只读访问(比如print出来)是完全没有问题的,参看下面这个例子:
a = 12
def g():
b = 11
def func():
print(a)
print(b)
func()
return
if __name__ == '__main__':
g()
python3 nonlocal vs global的更多相关文章
- python3中的nonlocal 与 global
nonlocal 与 global nonlocal翻译是非本地,global翻译是全局,它们都是python3的新特性.如果以类C语言的思维去看这2个关键字,很可能觉得它们差不多.但实际上它们很不一 ...
- 函数的嵌套+nonlocal和global关键字(重点)
1.在函数中声明函数 在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置 # 函数的互相调用 # def func1(): # pri ...
- nonlocal和global
获取变量时遵循LEGB原则,修改变量时需要global/nonlocal进行修改 global # global的使用 函数外定义了全局变量: global关键字在函数内会修改全局变量 函数外没定义全 ...
- [转]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个或多个字符 ? : 匹配 ...
随机推荐
- Java中this、super用法
这节我们主要是区分this 和 super这两个关键字的用法 起初我根本弄不清楚this 和 super这两个关键字的用法,也不明白在代码实例中为什么既用this又用super,下面就是原因: 1. ...
- 3D动画
先上一道菜 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- [redis] redis 存取键值对常用的三种使用方式 - Jedis、JedisPool、Jedis分布式
|-Jedis 普通方式 |-JedisPool 连接池方式(需要引入pool相关jar) |-Jedis 分布式 (需要引入pool相关jar) 引入jedis2.7.0和commons.pool2 ...
- [saiku] 配置saiku实时展现查询数据
缘起: 在默认的情况下,saiku是不能对数据进行实时展现的,只能通过刷新按钮或者重启服务器来刷新数据 这样以来会有很多的麻烦,每天得手动去刷新,这个操作只有管理员可以操作,在刷新以前客户看到的都是缓 ...
- HDUOJ------3336 Count the string(kmp)
D - Count the string Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- 伪静态<-> 动态页,伪静态,真静态的比较和选择
动态页,伪静态,真静态优缺点的比较 动态页不利于SEO优化. 动态页常常因为传参数的缘故后面会带一连串的问号.而搜索引擎会因为里面问号导致死循(机器人陷阱Spidertraps),所以带问号的地址搜索 ...
- Extjs 视频教程
---恢复内容开始--- 网易云课堂 <尚学堂_Ext视频教程> login.html <html> <head> <meta http-equiv=&quo ...
- 如何实现301的跳转?当输入域名http://xxx.com的时候自动重定向到www上去
答案:在服务器上操作,注意勾选和不勾选的区别,使用Fiddle进行观察,301和302之间的区别
- CentOS Hadoop格式化HDFS异常java.net.UnknownHostException
#bin/hadoop namenode -format DEPRECATED: Use of this script to execute hdfs command is deprecated. I ...
- 谷歌官方SwipeRefreshLayout下拉刷新的用法。
<Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新> 下拉刷新在如今移动开发中应用如此广泛和普遍,以至于谷歌干脆在SDK中给予支持.在android-su ...