变量的作用域

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。在程序中,一般会根据变量的“有效范围”将变量分为“全局变量”和“局部变量”。

1  局部变量

局部变量是指在函数内部定义并使用的变量,它只在函数内部有效。即函数内部的名字只在函数运行时才会创建,在函数运行之前或者运行完毕之后,所有的名字就都不存在了。所以,如果在函数外部使用函数内部定义的变量,就会出现抛出NameError异常。

例如,定义一个名称为f_demo的函数,在该函数内部定义一个变量message(称为局部变量),并为其赋值,然后输出该变量,最后在函数体外部再次输出message变量,代码如下:

def f_demo():

    message = '唯有在被追赶的时候,你才能真正地奔跑。'

    print('局部变量message =',message)                 # 输出局部变量的值

f_demo()                                             # 调用函数

print('局部变量message =',message)                     # 在函数体外输出局部变量的值

运行上面的代码将显示如图14所示的异常。

图14  要访问的变量不存在

2  全局变量

与局部变量对应,全局变量为能够作用于函数内外的变量。全局变量主要有以下两种情况:

(1)如果一个变量,在函数外定义,那么不仅在函数外可以访问到,在函数内也可以访问到。在函数体以外定义的变量是全局变量。

例如,定义一个全局变量message,然后再定义一个函数,在该函数内输出全局变量message的值,代码如下:

message = '唯有在被追赶的时候,你才能真正地奔跑。'        # 全局变量

def f_demo():

    print('函数体内:全局变量message =',message)       # 在函数体内输出全局变量的值

f_demo()                                             # 调用函数

print('函数体外:全局变量message =',message)           # 在函数体外输出全局变量的值

运行上面的代码,将显示以下内容:

函数体内:全局变量message = 唯有在被追赶的时候,你才能真正地奔跑。

函数体外:全局变量message = 唯有在被追赶的时候,你才能真正地奔跑。

说明:当局部变量与全局变量重名时,对函数体的变量进行赋值后,不影响函数体外的变量。

场景模拟:在一个飘雪的冬夜,一棵松树孤独地站在雪地里,一会儿它做了一个梦……梦醒后,它仍然孤零零地站在雪地里。

图标 (35)

  实例05  一棵松树的梦

在IDLE中创建一个名称为differenttree.py的文件,然后在该文件中定义一个全局变量pinetree,并为其赋初始值,再定义一个名称为fun_christmastree的函数,在该函数中定义名称为pinetree的局部变量,并输出,最后在函数体外调用fun_christmastree()函数,并输出全局变量pinetree的值,代码如下:

pinetree = '我是一棵松树'                  # 定义一个全局变量(松树)

def fun_christmastree():                  # 定义函数

    '''功能:一个梦

       无返回值

    '''

    pinetree = '挂上彩灯、礼物……我变成一棵圣诞树 @^.^@ \n'    # 定义局部变量

    print(pinetree)                                 # 输出局部变量的值

# *****************************函数体外*********************************** #

print('\n下雪了……\n')

print('=============== 开始做梦…… =============\n')

fun_christmastree()                                     # 调用函数

print('=============== 梦醒了…… ===============\n')

pinetree = '我身上落满雪花,' + pinetree + ' -_- '        # 为全局变量赋值

print(pinetree)                                       # 输出全局变量的值

执行结果如图15所示。

图15  全局变量和局部变量的作用域

(2)在函数体内定义,并且使用global关键字修饰后,该变量也就变为全局变量。在函数体外也可以访问到该变量,并且在函数体内还可以对其进行修改。

例如,定义两个同名的全局变量和局部变量,并输出它们的值,代码如下:

message = '唯有在被追赶的时候,你才能真正地奔跑。'             # 全局变量

print('函数体外:message =',message)                       # 在函数体外输出全局变量的值

def f_demo():

    message = '命运给予我们的不是失望之酒,而是机会之杯。'    # 局部变量

    print('函数体内:message =',message)                   # 在函数体内输出局部变量的值

f_demo()                               # 调用函数

print('函数体外:message =',message)                       # 在函数体外输出全局变量的值

执行上面的代码后,将显示以下内容:

函数体外:message = 唯有在被追赶的时候,你才能真正地奔跑。

函数体内:message = 命运给予我们的不是失望之酒,而是机会之杯。

函数体外:message = 唯有在被追赶的时候,你才能真正地奔跑。

从上面的结果中可以看出,在函数内部定义的变量即使与全局变量重名,也不影响全局变量的值。那么想要在函数体内部改变全局变量的值,需要在定义局部变量时,使用global关键字修饰。例如,将上面的代码修改为以下内容:

message = '唯有在被追赶的时候,你才能真正地奔跑。'            # 全局变量

print('函数体外:message =',message)                       # 在函数体外输出全局变量的值

def f_demo():

    global message                                         # 将message声明为全局变量

    message = '命运给予我们的不是失望之酒,而是机会之杯。'     # 全局变量

    print('函数体内:message =',message)    # 在函数体内输出全局变量的值

f_demo()                       # 调用函数

print('函数体外:message =',message)            # 在函数体外输出全局变量的值

执行上面的代码后,将显示以下内容:

函数体外:message = 唯有在被追赶的时候,你才能真正地奔跑。

函数体内:message = 命运给予我们的不是失望之酒,而是机会之杯。

函数体外:message = 命运给予我们的不是失望之酒,而是机会之杯。

从上面的结果中可以看出,在函数体内部修改了全局变量的值。

注意:尽管Python允许全局变量和局部变量重名,但是在实际开发时,不建议这么做,因为这样容易让代码混乱,很难分清哪些是全局变量,哪些是局部变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/667193.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS鸿蒙学习笔记(28)@entry和@Component的生命周期

entry和Component的生命周期 entry和Component的关系Component生命周期Entry生命周期 生命周期流程图生命周期展示示例代码参考资料 HarmonyOS的生命周期可以分为Compnent的生命周期和Entry的生命周期,也就是自定义组件的生命周期和页面的生命周期。 entry和Compone…

MySQL 索引使用(二)

本篇继续介绍有关索引的使用。 目录 一、SQL提示 二、单列索引和联合索引 三、覆盖索引 四、前缀索引 五、索引的使用原则 一、SQL提示 我们在使用索引来进行查询时,很有可能会出现一个字段中包含多个索引的情况,例如这里有一个name字段&#xff0c…

曾巩,散文的艺术与哲思

曾巩,字子固,世称南丰先生,南丰(今江西)人,生于北宋真宗天禧三年(公元1019年),卒于北宋元丰六年(公元1083年),享年64岁。他是中国北宋…

Unity开发——编辑器打包、3种方式加载AssetBundle资源

一、创建ab资源 (一)Unity资源设置ab格式 1、选中要打包成assetbundle的资源; 可以是图片,材质球,预制体等,这里方便展示用预制体打包设置展示; 2、AssetBundle面板说明 (1&…

【React篇】组件错误边界处理(组件错误引起的页面白屏)

我们知道在生产环境react错误会导致整个页面崩溃,显示为空白页面。 比如下图的错误,导致了左侧页面直接白屏: 由于某一个组件报错导致整个页面崩溃是很严重的问题,那么我们应该如何去降低代码报错带来的影响呢? 我们…

JavaScript 动态网页实例 —— 窗口控制

除了打开和关闭窗口之外,还有很多其他控制窗口的方法。例如,可以使用 window.focus()方法使窗口获得焦点,也可以利用与其相对的window.blur 方法使窗口失去焦点。本节介绍移动窗口、改变窗口大小、窗口滚动、窗口超时操作、常用窗口事件、常用窗口扩展等窗口控制的方法和手段。…

mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版

ShareMouse 是一款跨平台的键盘和鼠标共享软件,它允许用户在多台计算机之间共享同一组键盘和鼠标,实现无缝的操作和控制。该软件适用于 Windows 和 macOS 系统,并且支持多种连接方式,包括局域网连接和无线连接。 使用 ShareMouse&…

从openstack环境中将服务器镜像导出的简单办法

1 登录openstack的页面,找到计划导出的主机信息。 通过实例名称, IP地址,找到对应的记录。点击实例名称,进入详情页。 在这里主要可以知道,当前主机在服务器上的文件ID,可以按这个ID去找对应的目录。 还可…

java读取文件内容(正则表达式匹配)

已知文件score.txt内容如下: 语文85分,数学89分,英语75分,马列95分。 要求解析出其中的成绩数据,并计算总成绩 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import jav…

JDK环境配置、安装

DK环境配置(备注:分32位与64位JDK,32位电脑只能按照32位JDK,64位电脑兼容32、64位JDK) 一、检查自己电脑是否安装过JDK 1.在电脑屏幕左下角,输入命令提示符CMD,打开命令提示符应用 2.在打开界…

QT系列教程(7) QLineEdit介绍

简介 QLineEdit属于输入插件,用来实现单行录入。支持几种录入模式。 Normal表示正常录入,录入的信息会显示在QLineEdit上。 Password表示密码录入的方式,录入的信息不显示QLineEdit,只是通过黑色圆点显示。 NoEcho 表示不显示录入信息&am…

“开源与闭源:AI大模型发展的未来之路“

文章目录 每日一句正能量前言数据隐私开源大模型与数据隐私闭源大模型与数据隐私数据隐私保护的共同考虑结论 商业应用开源大模型的商业应用优势:开源大模型的商业应用劣势:闭源大模型的商业应用优势:闭源大模型的商业应用劣势:商…

ros DWA局部规划模块

ROS-DWA模块 主要流程DWAPlannerROS::computeVelocityCommandsDWAPlannerROS::dwaComputeVelocityCommandsDWAPlanner::findBestPathSimpleScoredSamplingPlanner::findBestTrajectory 调参技巧DWA被目标点过度吸引,且不听全局规划器指挥 消融实验goal_front_costs_…

Java 异步编编程——Java内置线程池(Executor 线程池)

文章目录 知道线程池是什么以及解决什么问题Java 内置线程池Java 内置线程池设计结构及执行机制ThreadPoolExecutor 中的概念生命周期核心参数阻塞队列4 种任务拒绝策略 线程池使用场景 知道线程池是什么以及解决什么问题 线程池(Thread Pool)是一种基于…

Kafka Java API

1、增加依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>1.0.0</version> </dependency>2、三个案例 案例1&#xff1a;生产数据 import org.apache.kafka.clients.p…

SpringBoot HelloWorld 之 实现注册功能

SpringBoot HelloWorld 之 实现注册功能 一.配置 创建数据库big_event CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 用户名,password varchar(32) COLLATE utf8_unicode_ci …

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势

β-烟酰胺单核苷酸&#xff08;NMN&#xff09;功能不断得到验证 市场规模呈增长态势 β-烟酰胺单核苷酸&#xff08;β-Nicotinamide mononucleotide&#xff0c;NMN&#xff09;是一种生物活性分子&#xff0c;是一种辅酶Ⅰ&#xff08;NAD&#xff09;的前体&#xff0c;也是…

WPF Binding对象

在WinForm中&#xff0c;我们要想对控件赋值&#xff0c;需要在后台代码中拿到控件对象进行操作&#xff0c;这种赋值形式&#xff0c;从根本上是无法实现界面与逻辑分离的。 在WPF中&#xff0c;微软引入了Binding对象&#xff0c;通过Binding&#xff0c;我们可以直接将控件与…

NTFS磁盘格式读写工具:Tuxera NTFS 2021 for Mac

Tuxera NTFS 是一款用于 macOS 系统的 NTFS 文件系统驱动程序。NTFS 是 Windows 系统中常用的文件系统&#xff0c;而 macOS 默认只支持读取 NTFS 格式的磁盘&#xff0c;不能进行写入操作。因此&#xff0c;如果你需要在 macOS 上进行 NTFS 磁盘的写入操作&#xff0c;就需要安…

php使用openssl返回false报错0308010C

本地php使用openssl返回false, 但是在服务器上测试正常openssl_encrypt($jsonStr, DES-ECB, $key, OPENSSL_RAW_DATA, ); 查看错误 openssl_error_string(); error:0308010C:digital envelope routines::unsupported 原因是: 服务器上的openssl是1.1版本, 本地是3.0版本 通…