Python教程:深入理解Python中的命名空间和作用域

在 Python 编程中,理解命名空间(Namespace)和作用域(Scope)是至关重要的。它们决定了变量和函数的可见性和访问性,并直接影响代码的结构和行为。本文将深入探讨 Python 3 中命名空间和作用域的概念、规则以及相关的高级主题。

1. 了解命名空间和作用域的概念


命名空间: 命名空间是一个存储变量名与对象之间关联关系的系统。在 Python 中,命名空间可以视为一个字典,其中键是变量名,值是与之关联的对象。

作用域: 作用域是代码中可访问变量的范围。在 Python 中,作用域可以是全局(Global)或局部(Local)。全局作用域在整个程序中都可见,而局部作用域仅在定义它们的函数内部可见。

命名空间和作用域之间存在直接关系:每个作用域都有其对应的命名空间,用于存储该作用域内的变量和函数。

2. Python 中的命名空间


全局命名空间: 全局命名空间是在整个程序中可见的命名空间。全局变量和函数在程序的任何地方都可以被访问和调用。

global_var = 10  # 全局变量def global_function():print("This is a global function")print(global_var)
global_function()

局部命名空间: 局部命名空间是在函数内部创建的命名空间,其中包含局部变量和函数。它仅在函数执行期间存在,并在函数执行结束后销毁。

def local_scope():local_var = 20  # 局部变量print(local_var)local_scope()
# print(local_var)  # 会导致 NameError,因为 local_var 不在当前作用域内可见

3. 作用域规则


在 Python 中,作用域查找遵循 LEGB 规则:Local -> Enclosing -> Global -> Built-in。

  • Local(局部): 函数内部的作用域。
  • Enclosing(嵌套): 包围在函数中的其他函数的作用域。
  • Global(全局): 程序的最顶层作用域或者在函数外部的作用域。
  • Built-in(内置): Python 的内置命名空间,包含常用的内置函数和异常名称。
x = 'global'def outer():x = 'enclosing'def inner():x = 'local'print(x)  # 打印局部变量 xinner()outer()  # 输出:local
print(x)  # 输出:global

4. global 和 nonlocal 关键字


  • global 关键字: 用于在函数内部修改全局变量的值。
count = 0def increment():global countcount += 1increment()
print(count)  # 输出:1
  • nonlocal 关键字: 用于在嵌套函数内部修改外部函数的局部变量。
def outer():x = 10def inner():nonlocal xx += 1print(x)inner()outer()  # 输出:11

5. 闭包和作用域


闭包的概念: 闭包是一个函数及其相关的引用环境。它使得函数可以访问定义时的作用域,即使在其定义所在的作用域已经不存在。

def outer():x = 10def inner():print(x)return innerclosure = outer()
closure()  # 输出:10

6.代码示例


示例1:

# 全局命名空间
global_var = 10def outer_function():# 闭合命名空间outer_var = 20def inner_function():# 局部命名空间nonlocal outer_varouter_var += 5local_var = 30print("内部函数局部命名空间:", locals())print("内部函数访问外部变量 outer_var:", outer_var)print("内部函数访问全局变量 global_var:", global_var)inner_function()print("外部函数局部命名空间:", locals())print("外部函数访问外部变量 outer_var:", outer_var)print("外部函数访问全局变量 global_var:", global_var)outer_function()
print("全局命名空间:", globals())
print("全局命名空间访问全局变量 global_var:", global_var)

这个示例演示了全局命名空间、局部命名空间、嵌套命名空间以及全局作用域、局部作用域、嵌套作用域的概念。

示例2:

# 示例1:局部变量和全局变量
global_var = 100def local_vs_global():local_var = 200print("Inside function - global_var:", global_var)print("Inside function - local_var:", local_var)local_vs_global()
print("Outside function - global_var:", global_var)# 示例2:LEGB 规则演示
x = 'global'def outer():x = 'enclosing'def inner():x = 'local'print(x)inner()outer()
print(x)# 示例3:使用闭包实现计数器
def counter():count = 0def increment():nonlocal countcount += 1return countreturn incrementcounter1 = counter()
print(counter1())  # 输出:1
print(counter1())  # 输出:2

这段示例代码展示了Python中命名空间和作用域的概念,以及相关的示例和练习。

  1. 局部变量和全局变量示例

    • 函数 local_vs_global() 中 global_var 是全局变量,local_var 是局部变量。在函数内部,可以访问全局变量和局部变量。
    • 执行 local_vs_global() 后,在函数内部输出了全局变量和局部变量的值,然后在函数外部输出了全局变量的值。
  2. LEGB 规则演示

    • 在 outer() 函数中定义了 x 为 'enclosing'。
    • 在 inner() 函数中定义了 x 为 'local'。
    • 根据 LEGB 规则,内部函数 inner() 在局部作用域查找变量,因此输出 'local'。
    • 在外部函数 outer() 中输出了全局变量 x 的值,因为在函数内没有定义 x
  3. 使用闭包实现计数器示例

    • 函数 counter() 中定义了一个局部变量 count
    • 函数 increment() 使用了 nonlocal 关键字来修改外部函数的局部变量 count
    • 每次调用 counter1(),都会增加 count 的值,并返回新的计数值。

7.常见面试题


问题: 请解释 Python 中的闭包,并举例说明其在命名空间和作用域中的应用。

答案:

闭包是指在函数内部定义的函数,并且该内部函数引用了外部函数的变量。闭包允许函数捕获并维持外部作用域的状态,即使外部函数已经执行完毕,内部函数仍然可以访问外部函数的变量。这种特性在 Python 中是通过函数的嵌套和函数对象的特性实现的。

闭包在命名空间和作用域中的应用非常广泛,它可以用于封装私有变量、实现装饰器、延迟计算等场景。

示例:

def outer_func(x):def inner_func(y):return x + yreturn inner_func# 创建一个闭包
add_five = outer_func(5)# 调用闭包
result = add_five(3)
print(result)  # 输出 8

在这个示例中,outer_func 返回了一个内部函数 inner_func,并且 inner_func 中引用了外部函数 outer_func 的变量 x。当我们调用 outer_func(5) 后,它返回了一个闭包 add_five,该闭包可以用来将其参数与 5 相加。即使 outer_func 已经执行完毕,但是 add_five 仍然可以访问并使用 outer_func 中的变量 x

闭包的作用是延长了外部作用域内变量的生命周期,使得外部作用域的变量在内部函数中依然可用,这样做的好处是可以封装数据,实现更复杂的逻辑,提高代码的模块化和可复用性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postgresql 从小白到高手 十一 :数据迁移ETL方案

文章目录 Postgresql 数据迁移ETL方案1、Pg 同类型数据库2 、Pg 和 不同数据库 Postgresql 数据迁移ETL方案 1、Pg 同类型数据库 备份 : pg_dump -U username -d dbname -f backup.sql插入数据: psql -U username -d dbname -f backup.sqlpg_restore -U username…

基于PCIE4C的数据传输(三)——使用遗留中断与MSI中断

本文继续基于PCIE4C IP核实现主机(RHEL 8.9)与FPGA(Xilinx UltrascaleHBM VCU128开发板)间DMA数据传输时的中断控制。本文分为三个部分:FPGA设计、驱动程序设计、上板测试。 FPGA设计 基于PCIE4C的数据传输&#xff0…

聚醚醚酮(Polyether Ether Ketone)PEEK在粘接使用时可以使用UV胶水吗?要注意哪些事项?

一般情况下,聚醚醚酮(Polyether Ether Ketone,PEEK)是一种难以黏附的高性能工程塑料,而UV胶水通常不是与PEEK进行粘接的首选方法。PEEK表面的化学性质和高温性能使得它对常规胶水的附着性较低。然而,有一些…

深度学习之基于Matlab NN的伦敦房价预测

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 房价预测是房地产领域的一个重要问题,对于投资者、开发商以及政策制定者等都具有重要的指…

阿里云详细介绍,与AWS和GCP比较

一、阿里云详解 阿里云(Alibaba Cloud),也被称为阿里巴巴云计算,是中国最大的云服务提供商,同时在全球范围内也具有显著的市场影响力。自2009年成立以来,阿里云已经发展成为一个提供全方位服务的云平台&am…

如何选择适合的美国站群服务器:经济实惠而可靠的选择

如何选择适合的美国站群服务器:经济实惠而可靠的选择 在今天的数字化时代,选择适合的服务器对于个人网站或企业来说至关重要。一台性能稳定、价格实惠的美国站群服务器能够为您的网站提供所需的支持,但在选择之前,有一些关键因素…

对话访谈——五问RAG与搜索引擎:探索知识检索的未来

记一次关于RAG和搜索引擎在知识检索方面的对话访谈,针对 RAG 与传统搜索引擎的异同,以及它们在知识检索领域的优劣势进行了深入的探讨。 Q:传统搜索引擎吗,通过召回-排序的两阶段模式,实现搜索逻辑的实现,当前RAG技术也…

SDB2F5 1.5A,高达28V输出1.2MHz升压转换器芯片IC

一般说明 该SDB2F5是一个恒定的频率,5针SOT23电流模式升压转换器,低功耗应用。SDB2F5交换机位于1.2MHz,并允许使用高度小于或等于2mm的微小、低成本电容器和电感器。内部软启动的结果在小浪涌电流和延长电池寿命。 该SDB2F5操作从一个…

Spring6 当中的 Bean 循环依赖的详细处理方案+源码解析

1. Spring6 当中的 Bean 循环依赖的详细处理方案源码解析 文章目录 1. Spring6 当中的 Bean 循环依赖的详细处理方案源码解析每博一文案1.1 Bean的循环依赖1.2 singletion 下的 set 注入下的 Bean 的循环依赖1.3 prototype下的 set 注入下的 Bean 的循环依赖1.4 singleton下的构…

云原生周刊:K8s 中的服务和网络 | 2024.4.29

开源项目推荐 k8s-image-swapper k8s-image-swapper 是 Kubernetes 的一个变更 Webhook,它将镜像下载到自己的镜像仓库,并将镜像指向该新位置。它是 docker pull-through proxy 的一个替代方案。 KubeIP v2 KubeIP v2 是 DoiT KubeIP v1-main 开源项…

使用 Microsoft 成本管理 + 计费控制 Azure 支出和管理账单

原文:Control Azure spending and manage bills with Microsoft Cost Management and billing learning path - Training | Microsoft Learn Azure Well-Architected Framework 是一个设计框架,可通过帮助工作负载执行以下操作来提高工作负载的质量&…

selenium启动参数设置

1. selenium selenium启动配置参数接收是ChromeOptions类,创建方式如下: from selenium import webdriver option webdriver.ChromeOptions()class SELEDEMO:def __init__(self):#启动配置参数接收是ChromeOptions类,创建方式如下&#xff1…

C++中,exit(0)和return 0的区别和作用

在C中,exit(0)和return 0;都可以用来结束程序,但它们在作用范围、执行流程以及清理机制上有明显的区别: 1.作用范围: return 0: 通常用在函数内部,特别是用在main函数中,表示程序正常结束,并返…

JavaScript中的Object方法、Array方法、String方法

个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 🔥Object方法🌞1 Object.is()🌞2 Object.…

Windows中Redis安装配置

一,下载 Redis官网 Redis中文网 Redis的Github资源 安装 更改资源路径及添加环境变量 添加防火墙异常 设置最大缓存 三、验证redis安装是否成功 redis-cli

selenium4.x 之浏览器弹窗处理

一、浏览器自带弹窗alert弹窗 webdriver中处理JavaScript所生成的alert、confirm以及prompt弹窗是很简单的。具体思路是使用switch_to.alert()方法定位到alert/confirm/prompt弹窗。然后使用text/accept/dismiss/send_keys方法按需进行操做 操作 说明返回text返回alert/confir…

22 重构系统升级-实现不停服的数据迁移和用户切量

专栏的前 21 讲,从读、写以及扣减的角度介绍了三种特点各异的微服务的构建技巧,最后从微服务的共性问题出发,介绍了这些共性问题的应对技巧。 在实际工作中,你就可以参考本专栏介绍的技巧构建新的微服务,架构一个具备…

Centos 7 安装 Redis

Centos 7 安装 Redis 安装步骤1、安装软件源2、安装redis3、创建符号链接4、修改配置文件5、启动 redis6、停止redis 安装步骤 1、安装软件源 如果是Centos 8 直接yum install 就可以了 yum install -y redis但是如果是Centos 7,redis 默认的是 redis 3 系列&…

深入探索MinIO:高性能的开源对象存储服务器

深入探索MinIO:高性能的开源对象存储服务器 文章目录 深入探索MinIO:高性能的开源对象存储服务器一、引言二、MinIO概述三、MinIO的特点四、MinIO的架构五、MinIO的使用场景六、MinIO的安装部署七、MinIO的操作管理八、MinIO的生态系统九、MinIO的扩展性…

【表格版】英语学习笔记--发音-元音和辅音

以下所有内容来自“AI豆包”。 元音(20个) 元音单元音(12个)双元音(8个)短长(ʊə)发音类似“乌尔”(ɪ)发音类似“一”但短促(iː)发音类似“一”(eɪ)发音类似“诶”(ə)发音类似“额”但短促(əː)发…