26. 命名空间

news2025/1/13 2:45:55

前言:如果你接触过c/c++/c#/java,那么对于python中的命名空间也是如此,只不过在些许地方存在细微差异,不过倒无伤大雅。

1. 定义

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 python 字典来实现的。
命名空间提供了在项目中避免名字冲突的一种方法各个命名空间之间相互独立,没有任何关系同一个命名空间中不能有重名的,但不同的命名空间是可以重名而没有任何影响
实际上命名空间和操作系统中的文件系统的思想是类似的,分而治之就比如说,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名


Notice:同一个命名空间中不能有重名的,该怎么理解???

# 我们在全局的命名空间中定义了变量num, 变量赋值num=1后再赋值num=2, 
# 这里实际是新生成一个int值对象2, 再让num指向它,而1被丢弃, 不是改变a的值, 相当于新生成了num.
# 我们通过id()就可以清晰的看出, 两次num的id值确实不同. 
# 先num=1, 再num=2的行为在c/c++中就是变量重定义的行为, 是万万不行的, 但是在python中, 却是合理的.
# 可以这么理解, num一开始指向存储对象1的那块内存空间, 后来它有指向了对象2所指代的那块内存空间.
num =1
print(id(num))
num =2
print(id(num))

print(num)

print('-----------------------')
def test():
    print('Hello')

print(id(test))

def test():
    print('world')
print(id(test))

test()

在这里插入图片描述
[Question]:那这样一来,同一个命名空间中不能有重名的这句话究竟该怎么去理解它,我表示怀疑,此处目前留待查证,后续给出相关解释

2. 有什么好处

现在的软件项目都是一个团队协作,共同开发,每个人开发不同的功能,生成不同的python模块。因此,很容易出现同名的变量、函数或者类定义。那么有了命名空间,这个问题很容易就解决了。因为,不同的模块有不同的命名空间,命名空间之间是相互独立的。

3. 三种命名空间

python中存在3中命名空间。
3.1 内置命名空间(built-in names)
  python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
(1) python 解释器内置了很多函数, 不需要使用 import 导入即可使用。

# python 程序可以直接使用内置函数max()和abs().
print(max(1,12))
print(abs(-2))

(2) python 提供了一个内置命名空间,用于记录这些内置函数。python 中存在一个特殊的 builtins 模块,它记录了所有的内置函数。

import builtins
print(dir(builtins))  # dir()列出builtins模块中的变量和函数的名称

在这里插入图片描述

3.2 全局命名空间(global names)
模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
(1) python 中的内置函数 globals() 返回表示全局命名空间的字典。

# 在全局空间定义类Studnet, 函数test(), 变量s1和s2
class Student:
    def __init__(self, num):
        self.num = num

    def show(self):
        pass


def test():
    pass


s1 = Student(101)
s2 = Student(102)

print(globals())

# 程序输出
# 输出包括了 Student、test、s1和s2, 它们是用户定义的全局函数和变量.
{
	'__name__': '__main__', 
	'__doc__': None, 
	'__package__': None, 
	'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001ADFF046D00>, 
	'__spec__': None,
	'__annotations__': {}, 
	'__builtins__': <module 'builtins' (built-in)>, 
	'__file__': 'F:\\编程系列\\Python\\Python\\_01_Essential\\temp.py', 
	'__cached__': None, 
	'Student': <class '__main__.Student'>, 
	'test': <function test at 0x000001ADFF1DA550>, 
	's1': <__main__.Student object at 0x000001ADFF1E2FD0>, 
	's2': <__main__.Student object at 0x000001ADFF1E2F10>
}

3.3 局部命名空间(local names)
函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
(1) python 中的内置函数 locals() 返回表示全局命名空间的字典。

# Student类的构造函数中定义两个参数num, name, 以及在test()中定义一个局部变量addr.
# test()中定义2个参数num1, num2, 以及局部变量temp.
# 输出了函数参数和函数中定义的局部变量.
# Notice:locals()不能在全局中打印, 否则无法打印出以下效果.
class Student:
    def __init__(self, num, name):
        self.num = num
        self.name = name
        print(locals())

    def test(self):
        addr = 'SuZhou'
        print(locals())


def test(num1, num2):
    temp = 2
    print(locals())
    return num1 + num2 + temp


test(1, 3)
print('------')
Student(101, 'Zhang').test()

在这里插入图片描述

4. 命名空间的查找顺序

假设我们要使用变量 temp,则 python 的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间
如果找不到变量 temp,它将放弃查找并引发一个 NameError 异常。
(1) 在局部命名空间中,查找变量;
(2) 如果找不到,则在全局命名空间中,查找变量;
(3) 如果找不到,则在内置命名空间中,查找变量;
(4) 如果找不到,则抛出 NameError 异常。

# 示例性代码
tel = 101
name = 'Zhang'

def test(num1, num2):
    temp1 = 12
    temp2 = 24
    # 在此处访问某个变量
    '''
    内置命名空间, 包括: max、min、abs 等内置函数
    全局命名空间, 包括:tel, name, test()
    局部命名空间, 包括:num1, num2, temp1, temp2
    '''
    '''
    如果访问的变量是num1, 则能在局部命名空间中找到; 
    如果访问的变量是tel, 则能在全局命名空间中找到; 
    如果访问的变量是max,则能在内置命名空间中找到; 
    如果访问的变量是 x,在以上三个命名空间中查找不到, 此时抛出异常 NameError.
    '''

test()

5. 命名空间的生命周期

命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。

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

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

相关文章

lamda表达式

lamda表达式可以看作是一个匿名函数。编译器在编译的时候&#xff0c;会将lamda表达式处理成一个仿函数类&#xff0c;类名是类名是不重复的随机名称&#xff08;因为一个作用域中可能存在多个仿函数&#xff09;&#xff0c;返回该仿函数的对象。 lamda既然可以看作是一个匿名…

文件操作(C语言)

目录 1、为什么使用文件 2、什么是文件 程序文件 数据文件 文件名 3、文件的打开和关闭 文件指针 文件的打开和关闭 4、文件的顺序读写 文件读写介绍 文件读写函数 fputc&#xff08;字符 输出/写 函数&#xff09; fgetc&#xff08;字符 输入/读 函数&#xff09; fputs&…

VMware Workstation安装:与 Device/Credential Guard 不兼容

VMware Workstation安装&#xff1a;与 Device/Credential Guard 不兼容 1、快速解决 安装最新版VMware Workstation&#xff0c;例如我安装的是VMware Workstation Pro 17&#xff1a; 是的&#xff0c;解决报错的办法&#xff0c;就是安装/升级VMware Workstation版本。 参…

Aspose.PDF 23.1.0 for .NET Crack

Aspose.PDF for .NET可以在 .NET 程序中生成、屏蔽、编辑甚至将 PDF 文件转换为多种格式&#xff0c;而无需依赖 Adob​​e Acrobat。它是.Net核心对PDF的创新处理&#xff0c;可以在跨平台软件中执行文档操作甚至任务管理。借助 API&#xff0c;用户可以创建、更改、呈现、保护…

Spring Cloud:网关Gateway

✨ Spring Cloud:网关Gateway微服务网关概述为什么需要微服务网关服务网关的介绍Getway基本介绍微服务架构中网关所处位置三大核心概念工作流程入门案例搭建新建模块**cloud-gateway-gateway9527**导入依赖application.yml主启动类实现动态路由测试Predicate 断言基本介绍Route…

详解信奥一本通1290:采药

1290&#xff1a;采药【题目描述】辰辰是个很有潜能、天资聪颖的孩子&#xff0c;他的梦想是称为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他带到个到处都是草药的山洞里对他说&#xff1…

Fisco Bcos区块链三(webase中间件平台一键部署)

文章目录区块链开荒技术文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html4. Webase一键部署Java环境变量配置MySQL安装Ubuntu安装mysql数据库安装后设置密码&#xff1a;Python部署PyMySQL部署&#xff08;Python3.6&#xff09;拉取…

SpringBoot-过滤器的使用(在访问页面时过滤掉未登录的用户使其不能访问相应页面)

目录 概述 前端编写 页面展示 后端编写 编写接口 过滤器的编写 过滤器功能实验 概述 解决需求&#xff1a;在用户未登录的情况下访问未登录不可访问的页面时&#xff0c;请求将被过滤到&#xff0c;将用户退回登录页面。 技术选型 前端&#xff1a;Vue ElementUI 后端…

MySQL事务的四大特性以及并发事务问题

事务的四大特性ACID 【原子性&#xff08;Atomicity&#xff09;】&#xff1a;事务是不可分割的最小单元&#xff0c;要么全部成功&#xff0c;要么全部失败。&#xff08;eg&#xff1a;转账案例&#xff0c;转账过程中任何一步操作失败了&#xff0c;那么整个事务就失败了&a…

Python装饰器使用方法详解

文章目录1 装饰器背景知识1.1 基本概念1.2 应用场景2 简单的装饰器代码3 使用装饰器记录函数执行次数4 带参数的装饰器5 装饰器处理有返回值的函数1 装饰器背景知识 1.1 基本概念 装饰器&#xff08;Decorator&#xff09;是 Python 中一种函数或类&#xff0c;用来修饰其他函…

RabbitMQ部署

RabbitMQ部署1.单机部署1.1.下载镜像1.2.安装MQ1.3访问管理端2.集群部署2.1.集群分类2.2.设置网络1.单机部署 我们在Centos7虚拟机中使用Docker来安装&#xff0c;如未安装dockr&#xff0c;请参考《Centos7安装Docker》 1.1.下载镜像 方式一&#xff1a;在线拉取 docker …

C语言linux线程库pthread的简单使用教程

POSIX线程&#xff08;pthread&#xff09;库 POSIX线程库是用于C/C的基于标准的线程API。它允许产生一个新的并发流程。它在多处理器或多核系统上最为有效&#xff0c;在这些系统中&#xff0c;可以将流程安排在另一个处理器上运行&#xff0c;从而通过并行或分布式处理提高速…

flask框架全解

文章目录简介wsgiref安装配置文件方式一&#xff08;debug方式配置&#xff09;方式二&#xff08;环境变量方式&#xff0c;很少见&#xff09;方式三&#xff08;配置文件方式&#xff09;其他配置方式flask app路由组成写法动态路由的过滤查询字符串传参json和form等数据反向…

deepin系统如何安装惠普打印机

deepin系统如何安装惠普打印机 导读 想必现在有很多小伙伴对于deepin系统如何安装惠普打印机 安装惠普打印机的方法方面的知识都比较想要了解&#xff0c;那么今天小好小编就为大家… 想必现在有很多小伙伴对于deepin系统如何安装惠普p1007打印机 安装惠普打印机的方法方面的知…

【图卷积神经网络】02-谱域图卷积介绍

注&#xff1a;本文为第2章谱域图卷积介绍视频笔记&#xff0c;仅供个人学习使用 目录1、图卷积简介1.1 图卷积网络的迅猛发展1.2 回顾&#xff0c;经典卷积神经网络已在多个领域取得成功1.3 两大类数据1.4 经典卷积神经网络的局限&#xff1a;无法处理图数据结构1.5 将卷积扩展…

Python学习基础之快速入门

目录 首先我们下载最新的python版本&#xff1a;3.0 编写一个hello world 什么是python里面的IPO python运行有几种模式 编写一个温度转换器 在windows上执行python程序 官网&#xff1a;Welcome to Python.org Python 是一门易于学习、功能强大的编程语言。它提供了高效的…

保护视力台灯是白光还是暖光?盘点专业护眼的暖光护眼台灯

保护视力的灯光颜色是最接近太阳光最好&#xff0c;而白光与暖光主要是色温来控制的&#xff0c;低色温&#xff08;3000K以下&#xff09;&#xff0c;中性色温&#xff08;4000K左右&#xff09;&#xff0c;高色温&#xff08;5000K以上&#xff09;&#xff0c;低色温的光源…

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher)

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher) 请访问原文链接&#xff1a;https://sysin.org/blog/install-macos-13-on-unsupported-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.s…

RabbitMQ入门与应用

RabbitMQ入门与应用1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比&#xff1a;2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结3.SpringAMQP3.1.Basic Queue 简单队列模型3…

python机器学习数据建模与分析——pandas中常用函数总结

本文主要对数据建模与分析中常使用到的pandas内置函数进行总结分析&#xff0c;以此来熟悉数据建模与分析的流程。 文章目录一、Pandas数据结构1.1 数据结构—Series1.1.1 Series的创建方式1.1.2 使用索引和获取数据1.2 数据结构—DataFrame1.2.1 DataFrame的创建方式1.2.2 使用…