python nonlocal 与 global 详解
变量作用域问题
case1
通常在函数之外无法访问到函数内的变量
def f1():a=1
print(a)
NameError: name 'a' is not defined
case2
但函数内部的函数,是可以访问到外部函数的变量的。
def f1():a=1def f2():print(a)f2()
f1()
1
case3
但对于int tuple str 等不可变变量,内部变量只能访问不能修改。
def f1():a=1def f2():a+=1print(a)f2()
f1()
Traceback (most recent call last):File "xxx.py", line 11, in <module>f1()File "xxx.py", line 10, in f1f2()File "xxx.py", line 8, in f2a+=1
UnboundLocalError: local variable 'a' referenced before assignment
这个报错的逻辑大概是 能修改的是一个局部变量a, 你在修改一个变量a,但并没有这个局部变量a, 对于f2来说, 这个a是一个外部变量而不是局部变量。
case4
因此我们可以重新在函数内部中定义一个局部变量a,之后我们的操作都是对这个局部变量的操作了,与外部变量无关。
def f1():a = 1def f2():a = 1a += 1print('内层函数:', a)f2()print('外层函数:', a)
f1()
内层函数: 2
外层函数: 1
case5
case3这提到了不可变变量,对应list dic等可变变量来说,其实能改变的也是其内部的值而不是变量本身。可以类比于c++中的常量指针,可以修改指针指向的地址的值。
def f1():a = [1]def f2():a[0] += 1print('内层函数:', a[0])f2()print('外层函数:', a[0])
f1()
内层函数: 2
外层函数: 2
闭包
在case2中,既然f2可以访问到f1的内部变量,那么如果将f2作为f1的返回值,自然就可以通过f2在外部访问到f1的内部变量。
def f1():a=1def f2():return areturn f2
f2=f1()
print(f2())
1
这个f2
就是闭包。具体可以参考下面这篇文章,本篇不展开讨论。
Python闭包(Closure)详解 - 知乎 (zhihu.com)
nonlocal
python nonlocal深度理解_大义Python的博客-CSDN博客_python銝要onlocal
针对case3,如果我们就是想在内部函数中修改变量a,可以借助nonlocal
关键字。
nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。可以理解为,使用nonlocal关键字,内层可以将外层变量看做本地变量,赋予了内层函数对外层函数变量的修改权。
case6
def f1():a=1def f2():nonlocal aa+=1print('内层函数:', a)f2()print('外层函数:', a)
f1()
内层函数: 2
外层函数: 2
case7
因此必须外部有这个变量才能使用此关键字。
def f1():# a=1def f2():nonlocal aa+=1print('内层函数:', a)f2()print('外层函数:', a)
f1()
nonlocal a^
SyntaxError: no binding for nonlocal 'a' found
global
global
的作用是将变量声明为全局变量,即内部变量允许外部访问
case8
def f1():a = 1def f2():global aa=1a += 1print('内层函数:', a)f2()print('外层函数:', a)
f1()
print('外部:',a)
内层函数: 2
外层函数: 1
外部: 2
case9
def f1():# a = 1def f2():global aa=1a += 1print('内层函数:', a)f2()print('外层函数:', a)
f1()
print('外部:',a)
内层函数: 2
外层函数: 2
外部: 2
对比case8和case9,在7中,由于外层函数声明了变量a,因此会优先使用局部变量。而在case8中,全部都是使用的内层函数中声明的全局变量。
python nonlocal 与 global 详解相关推荐
- python中global和def_Python中 Global和Nonlocal的用法详解
nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当 ...
- python:基础知识详解
一.基本元素 变量 变量赋值: a="hello world" 变量命名: • 字母:a-z, A-Z, 其他语言的字母符号 • 数字:0-9 (不可以出现在首字符) • 下划线: ...
- python turtle循环图案-Python内置模块turtle绘图详解
urtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的 ...
- Python函数的参数详解
Python函数的参数详解 函数是一个通用的程序结构组件.你也许已经在其他的编程语言中见到过,有时也被称为子程序或过程.简而言之,函数主要扮演了两个角色: 1)最大化代码重用和最小化代码冗余--函数允 ...
- python中的GIL详解
python中的GIL详解 参考Python-- GIL 锁简述 GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就 ...
- python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解
本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...
- python字典之defaultdict详解
python字典之defaultdict详解 defaultdict为你的字典设定一个默认值或者默认值的数据类型: defaultdict接受一个工厂函数作为参数,如下来构造: dict =defau ...
- Python数据科学-技术详解与商业实践视频教程
Python数据科学-技术详解与商业实践(八大案例) 网盘地址:https://pan.baidu.com/s/13QrR_5Er6LgWCWzSb7qOrQ 提取码:s7vw 备用地址(腾讯微云): ...
- python爬虫入门实例-Python爬虫天气预报实例详解(小白入门)
本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下. 要求是把你所在城市过去一年的历史数据爬出来. 分析网站 我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有 ...
最新文章
- 如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串
- iOS 图片处理-利用GPUImage 磨皮和美白图片
- 灰度值怎么降级_快速提取照片中间调 用灰度蒙版为照片调色 得到更柔和的后期效果...
- Web pack misc
- Windows 令人“社死”的新功能,你都知道吗?
- linux里工作目录的字体变蓝,netterm访问Linux时字体和背景颜色随目录发生改变的问题解决...
- TensorFlow2.0:常用数据范围压缩函数
- 一文看尽预训练语言模型
- 提升Windows 7在双核CPU下的启动速度
- c语言 long double输出,printf和long double
- c语言抠图程序蓝屏,一种蓝屏抠图方法
- Python之多张图片拼接
- linux中怎样隐藏文件,Linux下如何隐藏文件
- 网站服务器进不去可以加速进去吗,让网页打开加速的方法
- CMD命令下载远程文件
- GF系列卫星分辨率介绍
- 学习笔记-《python程序员面试宝典》-基础知识-数据结构-编程思维(一)
- 关于对MIDlet套件进行数字签名
- 【璟丰机电】美国派克Parker产品在FPD中的行业应用案例盘点
- anaconda+pycharm安装
热门文章
- [转]非金钱激励员工的108种手段
- 王者荣耀s12服务器维护多久,王者荣耀s12多久更新,看看资深玩家解读官方公告...
- 【论文阅读】An Iterative Instance Selection Based Framework for Multiple-Instance Learning
- pico8 掌机_PICOCHAK的制作— PICO-8 Fantasy Console的演示
- nginx访问本地目录一直不好使_「welcome to nginx」nginx配置不生效,页面一直是默认页面welcome to nginx的解决办法 - seo实验室...
- 教你怎么有效运用大数据
- 使用 Packer 为Proxmox 自动化构建映像Ubuntu Server 20.04 虚拟机映像
- 《道路交通安全违法行为计分分值》扣分情形
- 千元喜茶订单配送费仅5元为乌龙事件,外卖小哥称自己看错了
- 西安计算机软件行业薪水,西安互联网行业平均薪酬7938元 全国排名19