python中数据的作用域

一、命名空间

        在 Python 中,命名空间是一个系统,它用于确保名字的唯一性,并防止命名冲突。命名空间是一个存储变量名称(或者更广泛地说,标识符)与对象之间映射的抽象概念。每个变量名你在程序中创建(或者导入)都存储在一个命名空间内。

1.1 类型的命名空间

        Python 中有几种不同类型的命名空间:

  1. 局部命名空间(Local Namespace):在函数内部创建的命名空间。它是临时的,每当函数被调用时创建,并在函数返回结果后销毁。这意味着,函数内部的变量名称在函数外部是不可见的。

  2. 全局命名空间(Global Namespace):在 Python 脚本的最顶层或模块层定义的变量存在于全局命名空间中。这个命名空间在脚本执行时创建,并在脚本执行结束后销毁。

  3. 内建命名空间(Built-in Namespace):Python 语言的一部分,包含了 Python 的内置函数和异常,比如 print(), id(), Exception 等。这个命名空间在 Python 解释器启动时创建,并在解释器关闭时销毁。

1.2 命名空间的寿命

  • 局部命名空间的寿命通常与函数执行的时间一致。
  • 全局命名空间的寿命通常与脚本执行的时间一致。
  • 内建命名空间的寿命通常与 Python 解释器的运行时间一致。

1.3 访问和修改命名空间

  • 使用赋值语句在相应的命名空间创建新的名称或修改现有名称。
  • 使用 global 关键词在局部作用域内操作全局命名空间的名称。
  • 使用 nonlocal 关键词修改闭包作用域中的变量。

1.4 命名空间的搜索顺序

        当你尝试访问一个变量时,Python 会按照 L-E-G-B(局部 ->嵌套 -> 全局 -> 内建)的顺序搜索这些命名空间。这个顺序确保了局部变量可以覆盖同名的全局变量或内建函数。

x = 'global x'  # 全局命名空间def test():y = 'local y'  # 局部命名空间print(y)print(x)  # 无局部变量 x,向上查找到全局命名空间test()# print(y)  # 错误,y 在全局命名空间不可见
print(x)  # 正确,x 在全局命名空间中

1.5 总结

        理解命名空间对于有效地组织代码和避免可能的名称冲突至关重要。命名空间的概念支持了 Python 中的作用域规则,帮助开发者写出更清晰、更健壯的程序。

二、L-E-G-B 规则

        在 Python 中,变量的作用域定义了在程序的哪个部分你可以访问这个变量。Python 中的作用域主要分为四类:Local、Enclosing、Global 和 Built-in,这也是通常所说的 L-E-G-B 规则。这也是Python 的变量名解析机制。

local(本地):理解为function,即作用域为函数内部
Enclosed(嵌套):理解为Enclosing function locals,即作用域为外部嵌套函数
Global(全局):理解为module,即作用域为模块
Built-in(内置):即作用域为Python内置模块

2.1 Local(局部作用域)

  • 局部作用域是指在函数内部定义的变量。这些变量只能在其被定义的函数内部访问,函数外部是无法访问的。

def func():x = 10  # 局部变量print(x)  # 输出 10func()
print(x)  # 这里会引发错误,因为 x 在这里是不可见的

2.2 Enclosing(闭包作用域)

  • 当你有一个定义在另一个函数内部的函数时,内部函数的作用域会被视为闭包作用域。这意味着内部函数可以访问其外层(非全局)函数的变量。

def outer():x = '外部 x'def inner():nonlocal x  # 使用 nonlocal 关键字声明 x 不是局部变量x = '内部 x'print(x)inner()print(x)outer()

2.3 Global(全局作用域)

  • 全局变量是在函数外部定义的,并且在程序的多个地方都可以访问。如果你需要在函数内修改全局变量,需要用到 global 关键字。

x = 5  # 全局变量def func():global xx = 10  # 修改全局变量 xprint(x)  # 输出 10func()
print(x)  # 输出 10

2.4 Built-in(内建作用域)

  • Python 本身预定义的命名空间,包含了内建的函数和异常处理等,例如 print(), len() 这些可以在程序任何地方直接调用的。

print = 5
print(print)  # 这将会导致错误,因为我们覆盖了内建的 print 函数

2.5 注意事项

  • 尽量避免在局部作用域中重定义全局变量或内建标识符,这可能会导致难以追踪的错误。
  • 使用 globalnonlocal 可以修改外层作用域中的变量,但应谨慎使用,因为它们可能使代码难以理解和维护。
  • 了解和遵守作用域规则有助于编写更清晰、更可靠的代码。

三、python项目的组织结构

         在 Python 中,包、模块和类是组织代码的基本单位,每个单位承担不同的角色,以支持更大的应用程序结构。理解这三者之间的区别和联系是非常重要的,特别是在设计大型软件系统时。以下是对每个概念的详细解释:

3.1 模块 (Module)

        模块是 Python 编程中的基本组织单位,是一个包含 Python 代码的文件(通常以 .py 结尾)。模块可以包含函数、类、变量定义以及可执行代码。模块的主要目的是帮助你逻辑地组织你的 Python 代码。模块可以被其他模块导入,以使用其功能,这可以通过 import 语句实现。

        例如,创建一个名为 calculator.py 的模块,其中包含一些基本的数学操作:

# calculator.pydef add(x, y):return x + ydef subtract(x, y):return x - y

        你可以在另一个文件中导入这个模块并使用其函数:

# main.py
import calculatorresult = calculator.add(5, 3)
print(result)  # 输出 8

3.2 包 (Package)

        包是一种将多个模块组织在一起的方式,本质上是一个包含多个模块的目录,该目录中包含一个特殊的文件 __init__.py。这个文件可以为空,但它必须存在于目录中,以便 Python 将该目录视为一个包(Python 3.3 之后可以没有 __init__.py 文件,但推荐保留以保持向后兼容性)。

        包可以有多级结构,即包内可以包含子包。这种结构有助于组织大型项目。

        例如,一个名为 mathematics 的包可能结构如下:

mathematics/
│
├── __init__.py
├── algebra.py
└── calculus.py

3.3 类 (Class)

        类是面向对象编程的基本构建块。Python 中的类提供了一种将数据和功能绑定在一起的方法。通过类定义,你可以创建自己的对象类型,并在这些对象中封装数据属性(变量)和方法(函数)。

        例如,定义一个简单的类 Point,表示二维空间中的点:

class Point:def __init__(self, x, y):self.x = xself.y = ydef distance_to_origin(self):return (self.x**2 + self.y**2) ** 0.5

        创建并使用 Point 类的对象:

p = Point(3, 4)
print(p.distance_to_origin())  # 输出 5.0

3.4 组织结构示例

        假设你有以下目录结构:

myproject/
│
├── main.py
├── database.py
│
└── package/├── __init__.py├── module1.py└── subpackage/├── __init__.py└── module2.py

 在这个结构中:

  • main.pydatabase.py 是同级的模块。
  • package 是一个包,包含一个子模块 module1.py
  • subpackage 是一个子包,包含另一个模块 module2.py

main.py 导入 module1.py

from package import module1

 从 module1.py 导入 module2.py(使用相对导入)

from .subpackage import module2

        在 Python 中,包和模块的层次结构有助于维护大型项目的组织和清晰性。理解如何在工程中组织 .py 文件和它们之间的关系是高效利用 Python 编程的关键部分。 

3.5 总结

  • 模块:单个文件,包含相关的代码。
  • :包含多个模块的文件夹,有助于进一步组织大型代码库。
  • :定义新类型的方式,封装数据和功能。

四、工程中的作用域

        在 Python 中,处理包、模块和类的作用域涉及理解如何在这些不同的代码结构之间共享和隔离数据。这里的作用域管理主要是通过模块和类的导入机制以及类内部的作用域规则来实现的。下面详细解释这些概念:

4.1 模块作用域

        每个 Python 文件(模块)本质上是一个独立的命名空间,这意味着在一个模块中定义的所有变量、函数、类等都是局限于该模块内的。如果你需要在一个模块中访问另一个模块定义的变量或函数,你需要显式地导入那个模块。

# module1.py
my_var = "Hello"def print_hello():print(my_var)# main.py
import module1module1.print_hello()  # 正确调用
print(module1.my_var)  # 正确访问

        在这种情况下,module1.py 中的 my_varprint_hello() 只能通过导入 module1 模块后使用模块名作为前缀来访问。

4.2 包的作用域

        包是一种组织多个模块的方式,它自身也遵循模块化的作用域规则。包内的模块必须通过相对或绝对导入来相互访问。包的结构可以帮助封装功能并防止命名冲突。

# package/module1.py
def func():print("Function in module1")# package/module2.py
from .module1 import funcfunc()  # 调用 package/module1.py 中的 func 函数

        在这里,module2.py 需要访问同一包内的 module1.py 中的函数,这是通过相对导入完成的。

4.3 类的作用域

        类定义其自身的命名空间,类中定义的变量和函数(方法)是局限于该类的。只有通过该类(或其实例)可以访问这些方法和属性。

        例如:

class MyClass:class_var = 10  # 类变量def __init__(self, value):self.instance_var = value  # 实例变量def method(self):return self.instance_var + MyClass.class_varobj = MyClass(20)
print(obj.method())  # 访问方法和变量

        在这个例子中,class_var 是一个类变量,对所有实例共享,而 instance_var 是每个类实例特有的。类的方法如 method 只能通过类的实例来访问。

4.4 总结

        在 Python 中,模块、包和类的作用域管理确保了代码的封装性和命名空间的独立性。这些机制有助于创建结构化和易于维护的代码库。正确理解和利用这些作用域规则是高效使用 Python 的关键。

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

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

相关文章

msvcp120.dll丢失怎么办,找不到msvcp120.dll的多种解决方法

最近,我在运行一个程序时遇到了一个错误,系统提示找不到msvcp120.dll文件,无法继续执行代码。这让我感到非常困扰,因为这个问题导致我无法正常运行这个程序。经过一番搜索和尝试,我找到了几种修复这个问题的方法&#…

如何开发、使用 Starter

开发 第一步&#xff1a;创建starter工程hello-spring-boot-starter并配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchem…

SpringBoot优点达项目实战:项目初始化(一)

SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09; 文章目录 SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09;1、项目介绍2、项目搭建3、依赖导入4、数据准备 1、项目介绍 技术框架 SpringbootmybatisPlusvueknife 2、项目…

创建App

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Django项目中&#xff0c;推荐使用App来完成不同模块的任务&#xff0c;通过执行如下命令可以启用一个应用程序。 python manage.py startapp app…

RT-Thread的Finsh实现学习

学习原因 工作中&#xff0c;使用同事开发的调试软件&#xff0c;输入参数打印的函数名就可以打印参数&#xff0c;但看不到代码实现&#xff0c;只能用自己微薄的知识积累去猜一下&#xff0c;之前尝试过&#xff0c;专门写一个函数&#xff0c;去解析编译生成的map文件&#…

名侦探李先生第一话:谁是真正的凶手(只出现一次的数字相关题解(力扣)+位操作符回忆)

引子&#xff1a;我们在之前的案子中破解过基础的单身狗问题&#xff0c;那面对更有挑战的案子&#xff0c;且看李先生如何破局&#xff0c;那下凶手&#xff01; 复习&#xff1a; 1&#xff0c;位操作符&#xff1a; 正整数原&#xff0c;反&#xff0c;补码都相同 首位是…

RocketMQ如何添加JVM监控

这里是小奏,觉得文章不错可以关注公众号小奏技术 JVM监控选型 本次JVM监控我们采用prometheus官方提供的jmx_exporter来实现 RocketMQJVM开发 整体目录 1. 新增agent目录 我们在distribution目录新增一个agent模块&#xff0c;然后添加两个文件 jmx_prometheus_javaagent-…

NtripShare2024年第二季度主要技术进展

NtripShare Cloud GNSS解算云平台方面 1、解算引擎增加根据卫星多路径效应自动剔除卫星的算法。 2、解算引擎增加解算时间段限制&#xff08;发现贵州某地在晚12点周期性效果变差&#xff09;。 3、增加2000坐标至地方坐标系转换的支持(七参数、四参数、TGO高程拟合&#x…

[数据集][目标检测]棉花检测数据集VOC+YOLO格式389张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;389 标注数量(xml文件个数)&#xff1a;389 标注数量(txt文件个数)&#xff1a;389 标注类别…

办理北京公司注册地址异常变更要求和流程

在北京注册公司时选择注册地址是非常重要的一环&#xff0c;注册地址不仅体现在营业执照上&#xff0c;在网上也有公示信息&#xff0c;一般选用的是商用地址和商住两用地址&#xff0c;在公司经营过程中&#xff0c;因为经营需要变更注册地址&#xff0c;也要依法变更&#xf…

低价可转债崩盘,发生了什么?

下跌不在于“出库”&#xff0c;甚至不在于“风险”。问题更多在于交易层面&#xff0c;何时能积聚更多的左侧资金并成功过渡至右侧。 低价券怎么了&#xff1f; 如果说6月初主要是小微盘品种的退市风险&#xff0c;后来是一些评级下调的品种&#xff0c;到本周&#xff0c;已…

ONLYOFFICE 桌面编辑器 8.1重磅来袭:全新功能提升您的办公效率

文章目录 前言ONLYOFFICE 桌面编辑器8.1一、PDF编辑&#xff1a;告别“头痛”时刻二、幻灯片版式&#xff1a;秒变“设计大师”三、无缝切换&#xff1a;办公界的“快速通道”四、语言支持&#xff1a;全球通吃的“翻译官”五、 隐藏“连接到云”板块&#xff1a;摆脱“云”的束…

26届软件工程生大二末的学期总结

一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 要不断的、反复的&#xff0c;爱上这个普通的自己。 本文简介&#xff1a;本人是大二软件工程专业&#xff0c;大二即将结束步入大三&#xff0c;这篇文章作为我的个人小笔记&#xff0c;只想在这里记录当下的心情与学习…

MySQL之可扩展性(一)

可扩展性 概述 有些应用仅仅适用于一台或少数几台服务器&#xff0c;那么哪些可扩展性建议是和这些应用相关的呢&#xff1f;大多数人从不会维护超大规模的系统&#xff0c;并且通常也无法效仿在主流大公司所使用的策略。选择一个合适的策略能够大大地节约时间和金钱。 MySQL…

图片转pdf,图片转pdf在线转换,在线图片转pdf

图片转PDF&#xff0c;听起来似乎是一个简单的操作&#xff0c;但实际上&#xff0c;它涉及到许多细节和技巧。有时候我们需要将图片转换为PDF格式&#xff0c;以便于分享、打印或保存。那么&#xff0c;如何将图片转换成PDF呢&#xff1f;接下来&#xff0c;我将为您详细介绍几…

【产品经理】订单处理9-台账库存管理

在订单处理过程中&#xff0c;台账库存的具体设计怎么做&#xff1f; 在订单处理过程中&#xff0c;分配仓库成功后要扣除仓库库存并计算商品缺货情况&#xff0c;仓库库存就是台账库存。 1&#xff0c;台账库存是针对某个仓库的库存&#xff0c;且台账库存只计算此商品SKU的库…

如何通过JDBC获取数据库连接 , 实现对单表数据增、删、改 ,实现对单表数据查询以及根据别名查询处理结果集扩展

1、获取连接 能够通过JDBC获取数据库连接 讲解 API介绍 java.sql.DriverManager类中有如下方法获取数据库连接 static Connection getConnection(String url, String user, String password) 连接到给定数据库 URL &#xff0c;并返回连接。 参数说明 String url&#x…

使用深度相机D435i+YOLOv8实现物体三维坐标实时显示

一、获取相机内参 下列指令为获取相机内参指令&#xff0c;输入此指令前需要获得相机的深度帧和彩色帧数据。 如何使用vsCode打开intel D435i深度相机 # 获取相机内参 depth_intrinsics depth_frame.profile.as_video_stream_profile().intrinsics color_intrinsics color…

Tomcat多实例配置

目录 一. 复制程序文件 二. 启动tomcat多实例 三. Tomcat多实例负载均衡 多实例&#xff08;多进程&#xff09;&#xff1a;同一个程序启动多次&#xff0c;分为两种情况: 第一种&#xff1a;一台机器跑多个站点&#xff1b; 第二种&#xff1a;一个机器跑一个站点多个实…

代码随想录训练营第十六天 513找树左下角的值 112路径总和I 113路径总和II 106从中序和后序遍历序列构造二叉树

第一题&#xff1a; 原题链接&#xff1a;513. 找树左下角的值 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;用回溯的思想&#xff1a; 这题就是求最大深度&#xff0c;当遍历到第一个最大深度的时候&#xff0c;记录下的节点值就是最左边的元素。 参数和返回…