关于 Python 变量的作用域,你真的了解吗?

Python变量的作用域 在编写Python程序时,了解作用域的规则和注意事项对于编写清晰、可维护的代码至关重要。作用域决定了变量的可见性和访问权限,合理地使用作用域可以避免变量命名冲突,提高代码的可读性和可维护性。作用域决定了变量的可见性和访问权限,理解作用域对于编写可靠的程序至关重要。在上述代码中,我们在函数内部定义了变量y,它具有局部作用域,只能在函数内部被访问。在上述代码中,我们使用了Python内置的print函数和内置模块math中的常量pi,在嵌套的函数中,可以访问外部函数定义的变量。 阅读详情

一、前言

作为一个写惯了 Java代码的猿猿来说,突然某一天发现 Python竟然可以在 finally 块中访问 try 块 中的变量,突然觉着三观碎了一地。所以好生总结了一下,两者之间的差距。我们先来系统的了解一下什么是作用域。


二、作用域

2.1 作用域的定义

在编程语言中,作用域(Scope)是指程序中定义的变量、函数和对象的可见性和可访问性范围。作用域规定了在程序中的哪些部分可以引用某个标识符(如变量名),以及在何处可以访问和操作这些标识符。

2.2 作用域的目的

作用域的主要目的是确保变量和标识符的命名不会冲突,同时提供了封装和信息隐藏的机制。并且可以防止变量被意外地修改或访问,同时也有助于组织和管理程序的结构。

2.3 作业域的种类

在大多数编程语言中,常见的作用域类型包括以下几种:

  1. 全局作用域(Global Scope):全局作用域是程序中定义的在整个程序中都可见和访问的变量、函数和对象的作用域。一般情况下,全局作用域在程序开始执行时创建,在程序结束时销毁。

  2. 局部作用域(Local Scope):局部作用域是在特定代码块或函数中定义的变量、函数和对象的作用域。局部作用域只在其定义的代码块或函数内部可见和访问,外部代码无法直接访问局部作用域中的标识符。

  3. 嵌套作用域(Nested Scope):嵌套作用域是指在一个作用域内部可以包含另一个作用域。例如,在一个函数内部定义的变量在函数内部可见,但在函数外部不可见。嵌套作用域允许内部作用域访问外部作用域中的标识符。

  4. 块级作用域(Block Scope):块级作用域是指在特定的代码块(例如,用花括号 {} 包围的代码)中定义的变量的作用域。在这种作用域中,变量只在其所在的代码块内部可见和访问。

作用域的具体规则和行为在不同的编程语言中可能有所不同,因此在使用特定的编程语言时,需要了解该语言的作用域规则和机制。正确理解和使用作用域可以帮助开发者编写更具可读性、可维护性和可扩展性的代码。

了解完作用域相关的基本知识之后,回到我们最初的问题上


三、关于 Python 语言作用域的 问题

3.1 发现问题

对于习惯了 Java语言的猿猿来说,在 Python 的 finally 块 可以访问 try 块中的变量,这种情况是百思不得其解的。为什么?

比如:

try:
    holo_pool=psycopg2.pool.SimpleConnectionPool(xxxx)
except (Exception, psycopg2.DatabaseError) as error:
    print("Error while connecting to PostgreSQL", error)
finally:
  if holo_pool:
        holo_pool.closeall
    print("PostgreSQL connection pool is closed")

3.2 问题解答

在 Python 中,try 和 finally 语句块是在同一个作用域中执行的,因此 finally 块可以访问 try 块中定义的变量。这是因为 Python 中的变量作用域是基于代码块的,而不是基于函数或类的。

在 Java 中,try 和 finally 语句块是在不同的作用域中执行的。try 块中定义的变量只在该块中可见,而 finally 块是在另一个作用域中执行的,因此不能访问 try 块中定义的变量。这是因为 Java 中的变量作用域是基于函数或类的,而不是基于代码块的。

3.2 总结

在 Python 中,作用域是基于代码块的,也就是说,变量的作用域是在它们被定义的代码块中。例如,在一个函数中定义的变量只能在该函数中访问,而在一个循环或条件语句中定义的变量只能在该循环或条件语句中访问。

在 Java 中,作用域是基于函数或类的,也就是说,变量的作用域是在它们被定义的函数或类中。例如,在一个函数中定义的变量只能在该函数中访问,而在一个类中定义的变量只能在该类的方法中访问。

也就是说 Python 的作用域是 块级作用域,而 Java 的作用域是 局部作用域。当然了它们也都有全局的作用域,比如 Python 的 全局变量 以及 Java 中 静态变量


---------------------------END---------------------------

题外话

感谢你能看到最后,给大家准备了一些福利!

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img

二、Python兼职渠道推荐*

学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
在这里插入图片描述

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

Python 变量作用域详解 作用域关键字修改变量局部作用域(Local)无只能在函数内访问全局作用域(Global)global允许在函数内修改全局变量嵌套作用域(Enclosing)nonlocal允许在嵌套函数内修改外部函数变量内置作用域(Built-in)无Python 预定义的变量和函数🔹最佳实践尽量避免使用全局变量,函数应尽量依赖传参。使用global和nonlocal时要小心,以免影响代码的可读性和可维护性。理解作用域有助于编写更清晰、高效的 Python 代码!🚀。 阅读详情

相关推荐

PTA-浙大版 《Python程序设计》 第三章编程题目及答案

博主第一次写优快云的博客,所以排版上可能有些不尽人意,代码部分均为自己的思路,可能复杂或者考虑欠妥,欢迎大家一起讨论~ 第一题:大于身高的平均值 这里用了np数组求得平均数,当然for循环累加也是可以的 import numpy as np data = input().split() data = list(map(int,data)) avg = np.mean(data) for i in data: if i > avg: print(i,end = '

Legendwqs的博客 1万+

Python中实现块作用域

Python如何实现块级作用域

coderock 500

多模态特征融合方法总结

由于本人的研究是文本、语音和图像三者模态数据的融合,所以针对的是这三种模态的特征融合方法进行总结。 首先,多模态特征融合的方法大体分为三种

华辰烟雨的博客 9万+

Python 五点搞定作用域(一)

转自:http://www.weidianyuedu.com/content/3614255267129.html 1、块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? #块级作用域 if 1 == 1: name = “lzl” print(name) for i in range(10): age = i print(age) 我们先看下执行结果 C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py lzl 9 Process fin

xiaoyaozi2020的博客 196

手把手教你ensp仿真搭建校园网(含防火墙及无线网络)系列(一)校园网核心交换机配置

本系列博客将带你从零开始,使用 华为 eNSP(Enterprise Network Simulation Platform) 仿真搭建一个完整的校园网络,涵盖 核心层、汇聚层、接入层、防火墙安全策略、无线AC+AP组网 等实战场景。无论你是网络初学者还是希望深化实战经验的工程师,都能通过本教程掌握企业级网络的规划、配置与排错技巧。

echo的博客 3791

[系统安全] 十一.那些年的熊猫烧香及PE病毒行为机理分析

如果你想成为一名逆向分析或恶意代码检测工程师,或者对系统安全非常感兴趣,就必须要认真分析一些恶意样本。熊猫烧香病毒就是一款非常具有代表性的病毒,当年造成了非常大的影响,并且也有一定技术手段。本文将详细讲解熊猫烧香的行为机理,并通过软件对其功能行为进行分析,这将有助于我们学习逆向分析和反病毒工作。后续作者还将对其进行逆向调试,以及WannaCry勒索蠕虫、各种恶意样本及木马的分析。基础性文章,希望您喜欢!同时,本文部分实验参考姜晔老师的视频分析,真的非常佩服和值得去学习的一位老师。技术路上哪有享乐,为了提升安

杨秀璋的专栏 7326

python的作用域和优先级_python块级作用域和函数作用域

(1)#Python中无块级作用域:#java/c# 不可以执行下面代码#python/javascript 可以执行if 1 == 1:name = 'python'print(name)for i in range(10):name = iprint(name)(2)#Python中以函数为作用域:def func():name = 'python'func()print(name)nam...

weixin_39944146的博客 143

YOLOv11改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解

在目标检测领域,小目标检测一直是一个具有挑战性的问题。算法以其高效快速的特点受到广泛关注,然而在面对小目标时,仍存在一些局限性。本文将介绍如何在中添加小目标检测层,以提高对小目标的检测能力。原始模型结构如下:详细内容参考:YOLOv11原始模型结构介绍 二、有效特征层对应的检测头类别 2.1 P3/8 - small检测头 原始模型中的对应的检测头主要用于检测相对较小的目标。其特征图大小相对较大,空间分辨率较高。 适合检测尺寸大概在到像素左右的目标。 2.2 P4/16 - medium检测头 这个检

Limiiiing的博客 8791

Python中的作用域、global与nonlocal

Python中的作用域、global与nonlocal 以下,以Python 3来介绍作用域相关的内容。 作用域 Python有四类作用域(Scope)。 局部(Local)作用域) 封闭(Enclosing)作用域 全局(Global)作用域 内置(Built-in)作用域 LEGB规则 在作用域中按名称去寻找对象(Python中一切皆对象)时,会按照LEGB规则去查找。 如果发...

三棵石头的博客 456

基于Spring Boot 3 + Vue 3 + Vite的现代化社区订餐系统设计与实现

本文将详细阐述系统的整体架构、数据库设计、核心功能模块(用户管理、餐厅管理、菜品浏览、购物车、订单管理)的实现细节,并提供关键代码示例。<el-input v-model="loginForm.password" type="password" placeholder="密码" prefix-icon="Lock" show-password />.requestMatchers("/api/auth/**", "/api/dishes/public/**").permitAll() // 公开接口。

2201_76125393的博客 468

BMD101传感器协议解析与STM32实现(LCD显示波形)

1 前言 BMD101传感器是神念科技开发的心电传感器。目前有一些商家开发了BMD101传感器模块,基本上都是利用蓝牙直接传输数据到PC或手机端。而本文介绍通过串口将数据传送给单片机,并在单片机上完成数据解析和心电波形LCD显示的功能。 2 通信协议解读 BMD101 通过 UART 接口通信。这是一个标准的 UART 接口,定义为 1 个起始位,8 个数据位,1 停止位格式,波特率 57600。 串口输出的数据包格式如下: 包括Header(帧头)、data payload(数据有效载荷)、CRC校验

weixin_44509533的博客 9285

python 作用域的简要说明

同事,问起我为什么class 下的变量在外部也可以调用,我一时摸不着头脑,只能用最口语化的方式解释。但是看上去他并不是很理解。发现我自己也没有认真研读python 的作用域,只是知道它就该这么用,一副should be so 的样子。好吧,让我们揭开他的面纱。全局变量和局部变量python 中没有块级作用域for i in range(5) print i pirnt i*i程序可以正常执行

Katios 7075

基于STM32L4XX、HAL库的ESP32-S3-WROOM-1-N4 WIFI模块驱动程序设计

/ 检查是否收到完整的一行(以\r\n结尾)// 例如: 解析AT命令响应或MQTT消息等。// UART2初始化已在CubeMX中配置。// USART2初始化函数(由CubeMX生成)// 缓冲区溢出,重置。// 如果需要等待响应。// 处理接收到的数据。// 处理接收到的数据。// 等待ESP32模块启动。// 主循环其他任务。// 启用UART全局中断。// 发送HTTP GET请求。// 发送AT测试命令。// 连接Wi-Fi。// UART中断回调函数。

zhusl6688的博客 286

Python之变量作用域

文章目录一 变量作用域1. Local(局部变量)2. Enclosed(嵌套)3. Global(全局)4. Built-in(内置)二 变量使用规则三 变量的修改1. global修改全局变量2. nonlocal修改外层函数变量 一 变量作用域 python变量作用域一般有4种,如下 1. Local(局部变量) Local(局部变量):暂时的存在,依赖于创建该局部作用域的函数。函数存,则局部变量存,函数亡,则局部变量亡。如下 #局部作用域 def fun(): b = 2 pri

qq_44690947的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Python 变量作用域

变量作用域(scope)在Python中是一个容易掉坑的地方。 Python的作用域一共有4中,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Global) 全局作用域 B (Built-in) 内建作用域 以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就

Muge 3万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python 函数—变量作用域

变量作用域指南

weixin_65289420的博客 1862

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

python作用域,变量作用域

变量作用域 一个程序的所有变量并不是在哪个位置都可以访问的。访问权限取决于这个变量是在哪里赋值的。 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。 如下为两种最基本的变量的作用域: 全局变量 局部变量 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时...

孤独的根号三 3999

深入了解Python 变量作用域

更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接:好看站 http://www.nrso.net/ 高州阳光论坛https://www.hnthzk.com/ 特点 python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。Python中并不是所有的语句块中都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。 1

菜鸟教程 633

Python变量作用域

变量作用域(Scope)指的是变量在程序中的可见范围,也就是在程序的哪些地方可以访问这个变量。局部作用域(Local)- 在函数内部定义的变量嵌套作用域(Enclosing)- 在嵌套函数的外层函数中定义的变量全局作用域(Global)- 在模块(文件)顶层定义的变量内置作用域(Built-in)- Python内置的变量(如print、int等)理解Python变量作用域是写出高质量代码的基础。记住以下几点:牢记LEGB查找顺序修改作用域变量需要使用global或nonlocal。

wyy202206174248的博客 1608

python变量的作用域

作用域又可以被称为命名空间,指变量起作用的范围。Python变量作用域可以分为四种,分别为局部作用域、嵌套作用域、全局作用域、内置作用域。 作用域 英文 简写 局部作用域 Local L 嵌套作用域 Enclosed E 全局作用域 Global G 内置作用域 Built-in B 四种作用域中变量的调用顺序采取“就近原则”,即为 LEGB 局部作用域 指某个函数...

菜鸟的博客 1911

Python中变量作用域规则详解

前言 作用域是指变量的生效范围,例如本地变量、全局变量描述的就是不同的生效范围。python的变量作用域的规则非常简单,可以说是所有语言中最直观、最容易理解的作用域。 在开始介绍作用域之前,先抛一个问题: x = 1 def f(): x = 3 g() print("f:", x) # 3 def g(): print("g:", x) # 1 ...

float *sword 2584
上一篇: Python的语法糖,你真的了解吗?
下一篇: Python从入门到精通:认识Python
Python_P叔
博客等级 码龄3年 5444粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值