首页 > 编程语言 >python中数据的作用域

python中数据的作用域

时间:2024-06-30 21:56:15浏览次数:20  
标签:Python 作用域 py python 模块 print 数据 命名

一、命名空间

        在 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)  # 输出 10

func()
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 x
    x = 10  # 修改全局变量 x
    print(x)  # 输出 10

func()
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.py

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

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

# main.py
import calculator

result = 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 = x
        self.y = y

    def 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 module1

module1.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 func

func()  # 调用 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_var

obj = MyClass(20)
print(obj.method())  # 访问方法和变量

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

4.4 总结

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

标签:Python,作用域,py,python,模块,print,数据,命名
From: https://blog.csdn.net/apple_53311083/article/details/139938792

相关文章

  • 计算机毕业设计python校园车辆管理系统的设计和实现
    一、拟开展研究的价值、意义车辆为人们的生活和工作带来了极大的方便,随着教职工和外来车辆的不断加大,进入校园的车辆数量也逐渐增加,校园车辆管理如果采用人工记录的工作方式,工作量大、效率低下、极易出错,且安全性不高。车辆离开校园时无法核实,不能完全准确记录车辆的出入。并......
  • 【深度学习】图形模型基础(1):使用潜在变量模型进行数据分析的box循环
    1.绪论探索数据背后的隐藏规律,这不仅是数据分析的艺术,更是概率模型展现其威力的舞台。在这一过程中,潜在变量模型尤为关键,它成为了数据驱动问题解决的核心引擎。潜在变量模型的基本理念在于,那些看似复杂、杂乱无章的数据表象之下,往往隐藏着一种更为简洁、有序的结构和规律,只......
  • Mysql--B+树--数据结构
    基本概念-B+树/B树B树(B-tree)和B+树(B+tree)是常见的自平衡搜索树数据结构,用于在存储和检索大量数据时提供高效的操作。它们具有一些共同的基本概念:节点(Node):B树和B+树的数据存储在节点中。节点可以包含多个关键字和对应的指针。在B树中,叶子节点和内部节点的结构相同,都存储数据......
  • 基于Python+Django的商城购物系统设计与实现(源码+数据库+讲解)
    文章目录前言详细视频演示项目运行截图技术框架后端采用Django框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • L1-025 正整数A+B python
    python实现注:输入的数据需要在区间[1,1000]内s=input()loc=s.index("")a=s[:loc]b=s[loc+1:]ifa.isdecimal()andb.isdecimal():ifint(a)in[iforiinrange(1,1001)]andint(b)in[iforiinrange(1,1001)]:print("{a}+{b}={sum}......
  • python 列表相关操作
    访问元素index(x):返回列表中第一个值为x的元素的索引。pythonfruits=['apple','banana','cherry']print(fruits.index('banana'))#输出:1count(x):返回列表中值为x的元素的个数。pythonnumbers=[1,2,2,3,2,4]print(numbers.count(2))#输......
  • 阿里云服务器数据库迁云: 数据从传统到云端的安全之旅(WordPress个人博客实战教学)
    ......
  • 移动硬盘插上去有响声但读不出来?八个原因解析,四个硬盘数据恢复方法!
    当移动硬盘插入电脑后发出响声但无法被正常读取时,这往往意味着硬盘可能遇到了某种问题,如物理损坏、连接问题或文件系统错误等。面对这种情况如何恢复硬盘中存储的重要数据呢?其实数据恢复并非总是轻而易举,但并非毫无希望。在尝试恢复数据之前,我们要冷静分析可能的原因,并采取......
  • lidar3607.2 雷达点云数据处理软件功能介绍
    V7.2.220240511获取软件安装包联系邮箱:[email protected],资源源于网络,本介绍用于学习使用,如有侵权请您联系删除!1.平台修复对不包含枝下高特征的单木进行枝下高提取时,生成的treedb枝下高字段产生异常记录,查看属性表时软件崩溃的问题;2.林业修复使用treedb作为种子点进行......
  • 数据分析神器Pandas快速入门3类型转换
    序列类型转换3.1自动转换在pandas1.0中,引入了一种新的转换方法.convert_dtypes。它会尝试将Series换为支持pd.NA类型。以city_mpg系列为例,它将把类型从int64转换为Int64:>>>city_mpg.convert_dtypes()01919223310417......