变量作用域问题

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 详解相关推荐

  1. python中global和def_Python中 Global和Nonlocal的用法详解

    nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当 ...

  2. python:基础知识详解

    一.基本元素 变量 变量赋值: a="hello world" 变量命名: • 字母:a-z, A-Z, 其他语言的字母符号 • 数字:0-9 (不可以出现在首字符) • 下划线: ...

  3. python turtle循环图案-Python内置模块turtle绘图详解

    urtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的 ...

  4. Python函数的参数详解

    Python函数的参数详解 函数是一个通用的程序结构组件.你也许已经在其他的编程语言中见到过,有时也被称为子程序或过程.简而言之,函数主要扮演了两个角色: 1)最大化代码重用和最小化代码冗余--函数允 ...

  5. python中的GIL详解

    python中的GIL详解 参考Python-- GIL 锁简述 GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就 ...

  6. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  7. python字典之defaultdict详解

    python字典之defaultdict详解 defaultdict为你的字典设定一个默认值或者默认值的数据类型: defaultdict接受一个工厂函数作为参数,如下来构造: dict =defau ...

  8. Python数据科学-技术详解与商业实践视频教程

    Python数据科学-技术详解与商业实践(八大案例) 网盘地址:https://pan.baidu.com/s/13QrR_5Er6LgWCWzSb7qOrQ 提取码:s7vw 备用地址(腾讯微云): ...

  9. python爬虫入门实例-Python爬虫天气预报实例详解(小白入门)

    本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下. 要求是把你所在城市过去一年的历史数据爬出来. 分析网站 我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有 ...

最新文章

  1. 如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串
  2. iOS 图片处理-利用GPUImage 磨皮和美白图片
  3. 灰度值怎么降级_快速提取照片中间调 用灰度蒙版为照片调色 得到更柔和的后期效果...
  4. Web pack misc
  5. Windows 令人“社死”的新功能,你都知道吗?
  6. linux里工作目录的字体变蓝,netterm访问Linux时字体和背景颜色随目录发生改变的问题解决...
  7. TensorFlow2.0:常用数据范围压缩函数
  8. 一文看尽预训练语言模型
  9. 提升Windows 7在双核CPU下的启动速度
  10. c语言 long double输出,printf和long double
  11. c语言抠图程序蓝屏,一种蓝屏抠图方法
  12. Python之多张图片拼接
  13. linux中怎样隐藏文件,Linux下如何隐藏文件
  14. 网站服务器进不去可以加速进去吗,让网页打开加速的方法
  15. CMD命令下载远程文件
  16. GF系列卫星分辨率介绍
  17. 学习笔记-《python程序员面试宝典》-基础知识-数据结构-编程思维(一)
  18. 关于对MIDlet套件进行数字签名
  19. 【璟丰机电】美国派克Parker产品在FPD中的行业应用案例盘点
  20. anaconda+pycharm安装

热门文章

  1. [转]非金钱激励员工的108种手段
  2. 王者荣耀s12服务器维护多久,王者荣耀s12多久更新,看看资深玩家解读官方公告...
  3. 【论文阅读】An Iterative Instance Selection Based Framework for Multiple-Instance Learning
  4. pico8 掌机_PICOCHAK的制作— PICO-8 Fantasy Console的演示
  5. nginx访问本地目录一直不好使_「welcome to nginx」nginx配置不生效,页面一直是默认页面welcome to nginx的解决办法 - seo实验室...
  6. 教你怎么有效运用大数据
  7. 使用 Packer 为Proxmox 自动化构建映像Ubuntu Server 20.04 虚拟机映像
  8. 《道路交通安全违法行为计分分值》扣分情形
  9. 千元喜茶订单配送费仅5元为乌龙事件,外卖小哥称自己看错了
  10. 西安计算机软件行业薪水,西安互联网行业平均薪酬7938元 全国排名19