【Python基础】变量的作用域与global、nonlocal
在 Python 中,变量的作用域指的是变量可以被访问的范围。Python 中的变量作用域有两种:
- 局部作用域:变量在函数函数内部的时候,只能在函数内部使用。这样的变量被称为局部变量。
- 如果在函数内部定义了一个变量,那么该变量只能在函数内部使用,如果想要在函数外部访问该变量,需要使用return语句将其返回。
- 全局作用域:变量在函数外部定义的时候,可以在任何地方访问。这样的变量被称为全局变量。
- 如果你在函数外部定义了一个变量,那么该变量可以在任何地方访问,包括函数内部和外部。
global
如果你想在函数内部修改全局变量的值,可以使用global
关键字。例如:
x = 10 # 全局变量
def foo():
"""需要注意的是,如果在内部定义了局部变量,那么在这之前访问该变量将会报错"""
x = 30
print("函数内部尝试修改全局变量x为", x) # 函数内部尝试修改全局变量x为 30
foo()
print("最终的全局变量x", x) # 最终的全局变量x 10
def foo1():
"""在这里,如果在global声明之前访问了x,那么x就会被定义为局部变量,那么再次声明global x 将会报错"""
global x
x = 20 # 修改全局变量
print("函数内部尝试使用global修改x为", x) # 函数内部尝试使用global修改x为 20
foo1()
print("最终的全局变量x为", x) # 最终的全局变量x为 20
在上面的代码中,我们使用global关键字在函数内部声明了x为全局变量。然后在函数内部修改了x的值。最后,在函数外部打印x的值,输出的结果为20。
需要注意的是,在使用global关键字之前,必须先在函数外部定义该全局变量。否则,Python 会将该变量视为局部变量,而不是全局变量。
此外,在函数内部不要滥用global关键字,应该尽可能地避免修改全局变量的值,以避免出现意外的错误。
nonlocal
nonloca
用于在嵌套函数中使用变量,其中变量不应属于内部函数。使用 nonlocal
关键字声明该变量不是局部变量。nonlocal 语句使列出的标识符引用最近的封闭范围中以前绑定的变量,不包括全局变量。nonlocal 关键字不能用于局部或全局变量,因此必须用于引用除全局和局部范围之外的另一个范围中的变量。
下面是一个简单的示例,演示了如何在嵌套函数中使用 nonlocal 关键字:
def outer():
x = "local"
def inner():
nonlocal x # 在 inner 函数中使用 nonlocal 关键字来声明 x 变量不是局部变量
x = "nonlocal" # 在 inner 函数中更改 x 变量的值时,它实际上更改的是 outer 函数中的 x 变量
print("inner:", x)
inner()
print("outer:", x)
outer()
# 输出inner: nonlocal
# 输出outer: nonlocal
关于nonlocal有几点需要注意的
- nonlocal 关键字只能在嵌套函数中使用。如果在非嵌套函数中使用 nonlocal 关键字,Python 解释器会抛出 SyntaxError。
- nonlocal 关键字不能用于局部或全局变量。它只能用于引用除全局和局部范围之外的另一个范围中的变量。
- nonlocal 关键字只能用于已经在封闭范围中绑定的变量。如果在封闭范围中没有找到变量,Python 解释器会抛出 SyntaxError。
- nonlocal 关键字不能用于改变不可变数据类型(如字符串、元组或数字)的值。它只能用于改变可变数据类型(如列表或字典)的值。
【Python基础】变量的作用域与global、nonlocal的更多相关文章
- 九. Python基础(9)--命名空间, 作用域
九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...
- Python中变量的作用域(variable scope)
http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...
- 十一. Python基础(11)—补充: 作用域 & 装饰器
十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...
- Python基础-变量作用域
1.函数作用域介绍 函数作用域 Python中函数作用域分为4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局 ...
- Python开发【第十二篇】python作用域和global nonlocal
python的作用域 作用域也叫名字空间,是访问变量时查找变量名的范围空间 python中的四个作用域 LEGB 作用域 英文解释 英文缩写 局部作用域 Local(function) L 外部嵌套函 ...
- python基础11_函数作用域_global_递归
看到了一个16进制转换的小知识点,就验证了一下运行结果. #!/usr/bin/env python # coding:utf-8 # 看到了16进制转换的问题.顺便验证一下. a = 255 b = ...
- Python中变量的作用域
一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...
- Python基础知识笔记-作用域
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的. 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python的作用域一共有4种,分别是: ...
- python基础——变量
变量是只不过保留的内存位置用来存储值.这意味着,当创建一个变量,那么它在内存中保留一些空间. 根据一个变量的数据类型,解释器分配内存,并决定如何可以被存储在所保留的内存中.因此,通过分配不同的数据类型 ...
- Java基础 变量的作用域
变量的作用域: 1. Java用一对大括号作为语句块的范围,称为作用域. 2.作用域中的变量不能重复定义. 3.离开作用域,变量所分配的内存空间将被JVM回收. public void name(){ ...
随机推荐
- Linux防火墙相关命令
查看以开放端口 firewall-cmd --list-ports 开启端口如6379 firewall-cmd --zone=public --add-port=6379/tcp --permane ...
- 智汇成城 ,创赢未来 | AI+产业峰会智慧城市专场在深成功举办!
11月4日下午,由福田区人才工作局指导,广州英码信息科技有限公司和共达地创新技术(深圳)有限公司联合主办,深圳市人工智能行业协会承办的AI+产业峰会之智慧城市专场活动在深圳市南山区成功举办. &quo ...
- 我亲自整理的Tampermonkey(以下简称tm)v4.13.6136的编辑器按键映射(基于联想笔记本键盘+win10+火狐浏览器企业版)
警告:你可以对该随笔内容进行转载,但必须写明其来源网址,以及其作者是博客园的zqdlly,否则后果自负!不要小看了我,我一定会让你付出你应得的成本. 0. 家喻户晓的 键 原生comment myMe ...
- Linux部分文件管理类命令
1.创建空文件和刷新时间 touch命令可以用来创建空文件或刷新文件的时间 touch [OPTION]... FILE... 选项: -a 仅改变atime和ctime -m 仅改变mtime和ct ...
- ICSFUZZ:操纵I/O、二进制代码重用以及插桩,来Fuzzing工业控制应用程序
本文系原创,转载请说明出处 Please Subscribe Wechat Official Account:信安科研人,获取更多的原创安全资讯 源码:GitHub - momalab/ICSFu ...
- Spring--注解开发+依赖注入
自动装配 数据层: 业务层: 自动装配: 结果: 若是将自动装配的注解放在set函数处: 结果: 结果相同,若是将set方法去掉的话: 结果: 这样的话,set方法也得到解放了耶! 以上都是按照类型装 ...
- Mathematica的Combinatorica`程序包使用笔记
目录 官方给出的程序包使用指南和一些示例 引论 步骤 0x00 导入程序包 0x01 Integer Partitions 0x02 Integer Compositions 0x03 partiti ...
- 《操作系统导论》读书笔记1——CPU虚拟化,进程
系列文章目录和关于我 一丶CPU的虚拟化 一个桃子,我们称之为物理(physical)桃子.但有很多想吃这个桃子的 人,我们希望向每个想吃的人提供一个属于他的桃子,这样才能皆大欢喜.我们把给每个 人的 ...
- C++ 用户输入验证
在编写程序时,请考虑用户将如何滥用您的程序,尤其是在文本输入方面.对于每个文本输入点,请考虑: 会不会提取失败? 用户可以输入比预期更多的输入吗? 用户可以输入无意义的输入吗 用户可以溢出输入吗? 以 ...
- 一次因生产事故与chatGpt的对话
一次因生产事故与chatGpt的对话 前言:生产出现了一个内存溢出的事故,记录错误信息.错误日志如下 org.springframework.web.util.NestedServletExcepti ...