Python:global、local与nonlocal变量
1 local和global变量
先来看一个最简单的Python程序例子:
import numpy as np
n = 2
def func(a):
b = 1
return a + b
print(func(n)) # 3
这里b
声明在函数func
内,则该变量拥有一个local scope(局部作用域,即在函数内),我们将这类变量称为local(局部)变量。
与之相对的np
和n
这两个变量都在函数之外声明,也即它们都在gobal scope(全局作用域)中,我们将它们global(全局)变量。
如果我们使用IDE在return a+b
处打断点并调试,那么可以看到IDE很方便地为我们展示了当前的局部和全局变量(以VSCode为例):
我们在local scope内也可以对global变量进行读取,如下所示:
n = 2
def func(a):
b = 1
return a + b + n # 对全局变量进行读取
print(func(n)) # 5
然而,如果在local scope内对global变量进行修改,比如这样写:
n = 2
def func(a):
n += 1 # 对全局变量进行修改
b = 1
return a + b + n
print(func(n))
运行到n+=1
这一语句是就会抛出异常:
UnboundLocalError: local variable 'n' referenced before assignment
此时我们需要用global
关键字在局部作用域内声明一个global变量,然后就可以自由修改该变量了:
n = 2
def func(a):
global n
n += 1
b = 1
return a + b + n
print(func(n)) # 6
2 nonlocal 变量
最后,我们还要提一种变量,叫nonlocal变量。这种变量常用在局部嵌套函数中将外层函数中的自由变量绑定到内层函数作用域(事实上外层函数中的自由变量对于内层函数来说既也非local也非global,故名nonlocal)。如下列所示:
# outside function
def outer():
message = 'local'
# nested function
def inner():
# declare nonlocal variable
nonlocal message
message = 'nonlocal'
print("inner:", message)
inner()
print("outer:", message)
outer()
打印输出:
inner: nonlocal
outer: nonlocal
可以看到,nonlocal
的使用将外层函数作用域中的自由变量message
和内层函数的作用域进行了绑定。
不过需要注意的是,如果我们使用global
关键字来声明变量:
# outside function
def outer():
message = 'local'
# nested function
def inner():
# declare global variable
global message
message = 'nonlocal'
print("inner:", message)
inner()
print("outer:", message)
outer()
那么最终的打印输出结果为:
inner: nonlocal
outer: local
这是因为global
关键字的使用让我们在inner()
函数(局部作用域)内声明了一个global变量,故如果我们在inner()
函数内做任何修改,则修改的结果只会在局部作用域(也即outer()
函数)之外出现。
此外,nonlocal
还可以用来构建如下列所示的闭包函数func
(参见我的博客《Python技法4:闭包和保存自由变量 》):
def sample():
n = 0
# 闭包函数
def func():
nonlocal n
n += 1
print("n =", n)
return func
f = sample()
f() # n = 1
f() # n = 2
这里也是通过nonlocal
关键字将自由变量与内层函数绑定,然后再对其进行修改的。
Python:global、local与nonlocal变量的更多相关文章
- [python]global与nonlocal关键字
在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local).嵌套作用域(Enclosing function locals).全局作用域(Global).内置作用域(bui ...
- python中全局global和局部nonlocal命名空间
python中全局global和局部nonlocal命名空间 局部名称空间对全局名称空间的变量可以引用,但是无法改变. count = 1 def func1(): count = 2 print(c ...
- python global和nonlocal的使用
◆global和nonlocal是Python的两个重要变量作用域关键字 1.global用在全局变量,应用场景: 变量定义在函数外部的时候,如果函数里面想改变这个全局变量的值,需要在当前的引用函数里 ...
- Python 3 学习笔记之——变量作用域、模块和包
1. 变量作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python 的作用域一共 ...
- 《疯狂Python讲义》重要笔记--变量
一个Python解释器 接下来的旅程——你需要下载好Python,Python解释器通常放在 /usr/local/bin/python3.7 ; 在Unix系统的bash中输入 where pyth ...
- TLS 与 python thread local
TLS 先说TLS( Thread Local Storage),wiki上是这么解释的: Thread-local storage (TLS) is a computer programming m ...
- Python基础一. 简介、变量、对象及引用
一.Python简介 Python是一门计算机编程语言,它是由荷兰人Guido van Rossum在1989年圣诞节期间为了打发无聊的圣诞节而编写的,作为ABC语言的继承 特性: 面向对象.解释型. ...
- 【类不类二】Python的类变量与实例变量
在研究类的时候,难免会有很多疑问,C论坛和博客园高手如云(不知道是不是也美女如云), 搜到了这篇博文,是介绍Python的类变量和实例变量的 ! 刚好在下对self.***这种形式的实例变 量不是很理 ...
- Python基础-类变量和实例变量
Python基础-类变量和实例变量 写在前面 如非特别说明,下文均基于Python3 大纲: 1. 类变量和实例变量 在Python Tutorial中对于类变量和实例变量是这样描述的: Genera ...
- Python入门学习:1.变量和简单的数据类型
python入门学习:1.变量和简单的数据类型 关键点:变量.字符串.数字 1.1 变量的命名和使用1.2 字符串1.3 数字1.4 注释 1.1 变量的命名和使用 变量,顾名思义是一个可变的量, ...
随机推荐
- 预约直播|3月30日下周四,应用促活大揭秘,快速提升DAU
[导读] 日常运营过程中,消息推送是App触达用户的常用手段,无论是新功能的通知,还是活动的提醒,都可以通过推送告知用户.千人千面的个性化推送,对于提升用户粘性.用户转化等指标都具有明显正向效果.越来 ...
- VS2019 开发 MFC ACtivex (OCX)控件
需求: js调用ocx方法,传递字符串到ocx控件中显示 操作步骤: 一.新建 ocx 项目 二.填写项目信息 三.完成项目创建 四.修改项目属性 打开 项目属性 -> 链接器 -> ...
- Redis Stack功能介绍及redis-om-dotnet使用示例
为了简化开发人员对较新的 Redis 模块及其提供的功能的体验,同时简化支持其功能的文档和客户端.以帮助开发人员从开始使用 Redis 的那一刻起,就能充分提高工作效率.Redis Stack诞生了. ...
- .NET Emit 入门教程:第六部分:IL 指令:8:详解 ILGenerator 指令方法:类型转换指令
前言: 经过前面几篇的学习,我们了解到指令的大概分类,如: 参数加载指令,该加载指令以 Ld 开头,将参数加载到栈中,以便于后续执行操作命令. 参数存储指令,其指令以 St 开头,将栈中的数据,存储到 ...
- 重新点亮shell————语法[四]
前言 简单介绍一下语法. 正文 数组: 定义数组: IPTS =(10.0.0.1 10.0.0.2 10.0.0.3) 显示所以数组元素: echo ${IPTS[@]} 显示数组元素的个数 ech ...
- docker 应用篇————docker基本命令[四]
前言 介绍一下一些docker的基本命令. 正文 帮助命令: 首先要学的肯定是docker --help 命令了,因为这样我们就不用经常去查官网. docker version docker info ...
- 当 Knative 遇见 WebAssembly
简介: Knative 可以支持各种容器化的运行时环境,我们今天来探索一下利用 WebAssembly 技术作为一个新的 Serverless 运行时. 作者:易立 Knative 是在 Kubern ...
- 走进RDS|说说关系型数据库与Serverless
简介:看到如今Serverless在云计算行业喷薄欲出的态势,像极了<星星之火,可以燎原>中的描述:虽然不能预测未来的发展和变化,但对于云计算来说这是个相对确定的方向.本文将和大家说说关 ...
- 数据智能构建管理平台Dataphin V2.9.4.3版本发布
简介: Dataphin发布V2.9.4.3版本升级多项产品能力,该版本在产品功能和用户体验上都进行了优化和提升,旨在为用户提供更完善的产品能力和体验,以加速企业数据中台建设进程. -更多关于数智化转 ...
- [FAQ] Git 修改最后一次的提交人和提交时间 ?
$ date -R Tue, 21 Mar 2021 21:08:58 +0800 $ git commit --amend --author="xxx <xxx@email.com ...