当前位置: 首页 > news >正文

python基础 - python命名空间与作用域

命名空间是名称与对象之间的关系,可以将命名空间看做是字典,其中的键是名称,值是对象。

命名空间不共享名称。

在命名空间中的名称能将任何python对象作为值,在不同的命名空间中相同的名称可以与不同的对象相关联。但是,如果存在名称解析协议,则多个命名空间可以一起工作来解析名称。也就是说,如果有多个命名空间(总是有的),那么可以定义搜索的顺序,依次在不同的命名空间里来查找某个名称(或确认其不存在于任何认可的命名空间)。在python中,将这一过程定义为作用域。

作用域搜索规则:LEGB

L:局部的(local)

E:封闭的(Enclosing)

G:全局的(Global)

B:内置的(Built-in)

一、局部命名空间

函数内部的命名空间,在调用函数的时候生成,调用结束时消失。当局部命名空间有效时,它是第一个用于检查某个名字存在性的命名空间。如果在局部命名空间内找到该名称,则返回与名字相关联的对象,反之提示出错。

二、全局命名空间

python在模块中维护命名空间,模块是一些python文件--包含函数等对象,并且可以导入其他程序使用。当某个模块被导入之后,该模块同时引入了一个命名空间,其中包含模块中所有的名称和关联的对象,可以通过存储在没个模块中的__dict__来查看这个命名空间,换句话说,字典就是这个模块的命名空间。

如果想要引用给模块中的对象,要使用点符号将名称和模块名称关联,这实际上是要求将对象与该模块中的名称相关联。

当python启动解释器时,它将自动导入两个模块,即模块__main__和__built-ins__。__main__模块是默认的全局模块,所有新对象都存储在其中。可以通过函数globals来访问该命名空间的字典。子啊平python解释器中通过输入用户交互时,globals是有效的命名空间。

1.局部赋值规则

python中有一种称为“本地赋值”的规则非常有趣。如果在函数内的任何地方进行局部赋值,则该赋值只在当前活动的命名空间中创建名称。有时这将产生副作用,举例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

>>> value= 27

>>>def func(param1,param2):

    for key,valin locals().items():

        print (key,val)

    value= value+ 1

>>> func(98765,43210)

param198765

param243210

Traceback (most recent call last):

  File "<pyshell#7>", line1,in <module>

    func(98765,43210)

  File "<pyshell#6>", line4,in func

    value= value+ 1

UnboundLocalError: local variable'value' referenced before assignment

>>>

首先通过赋值在全局命名空间中创建了变量value。也许你会认为,当函数值加1是会先在局部的命名空间中查找变量,无法找到时在全局命名空间中找到该名字。可以并不是这样。

python提出如下假设,如果在函数体内的任何地方对变量赋值,则python将名称添加到局部命名空间中。语句value=value+1对对象value进行赋值。python假设无论在何处发生赋值,value都是函数func局部命名空间的一部分。当python尝试把1跟value相加时,该value名称在局部命名空间中,但它没有关联值,所以python报错。

问题在于python何时决定使value出现在局部命名空间中。实际value出现在局部命名空间中发生在代码运行前,即,在python运行到函数定义之前。由于创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对value的赋值,并把它添加到局部命名空间中,当函数执行时,python解释器认为value在局部命名空间中但没有值,所以会产生错误。

2.global语句

有一个方法可以解决上面的问题。如果在函数体内,使用global语句将变量声明为全局变量,那么python不会为该变量在命名空间中创建局部名称。

三、内置模块

遵循LEGB搜索规则,如果python不能在局部命名空间中找到某个名称,则会在全局命名空间中继续寻找,它寻找到的将是python的内置名称。

built-in模块和其他模块一样,都具有__dict__属性,这就是模块的命名空间

四、封闭式变量

“封闭式”的作用域规则适应于函数定义函数时,也就是说,在函数体内定义了一个新的函数。这个函数体内的函数是外函数的局部命名空间中的一部分,意味着只有在外函数执行期间才能够运行。完整的LEGB规则是先检查局部命名空间,之后是封闭在局部命名空间中的其他函数,之后是全局命名空间,在最后以内置命名空间结束。

相关文章:

python基础 - python命名空间与作用域

命名空间是名称与对象之间的关系&#xff0c;可以将命名空间看做是字典&#xff0c;其中的键是名称&#xff0c;值是对象。 命名空间不共享名称。 在命名空间中的名称能将任何python对象作为值&#xff0c;在不同的命名空间中相同的名称可以与不同的对象相关联。但是&#xf…...

MapReduce实战案例(3)

案例三: MR实战之TOPN(自定义GroupingComparator) 项目准备 需求测试数据 有如下订单数据 订单id商品id成交金额Order_0000001Pdt_01222.8Order_0000001Pdt_0525.8Order_0000002Pdt_03522.8Order_0000002Pdt_04122.4Order_0000002Pdt_05722.4Order_0000003Pdt_01222.8 现在…...

Socket(三)

文章目录 1. 设置Socket选项2. TCP_NODELAY3. SO_LINGER4. SO_TIMEOUT5. SO_RCVBUF和SO_SNDBUF6. SO_KEEPALIVE7. OOBINLINE8. SO_REUSEADDR9. IP_TOS服务类型10. Socket异常 1. 设置Socket选项 Socket选项指定了Java Socket类所依赖的原生socket如何发送和接受数据&#xff0…...

【JVM】12. 垃圾回收相关概念

文章目录 12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出&#xff08;OOM&#xff09;内存泄漏&#xff08;Memory Leak&#xff09; 12.3. Stop The World12.4. 垃圾回收的并行与并发并发&#xff08;Concurrent&#xff09;并行&#xff08;Parallel&#xff09;并…...

Java 版 spring cloud 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

【Linux系统基础快速入门详解】Linux系统命令行介绍、命令提示符知识详解: ~/#/@等符号

Linux系统的命令行界面是Linux系统的核心部分,也是最常用的部分。在命令行界面中,用户可以使用各种Linux系统命令进行文件操作、系统管理、网络管理等操作。下面介绍一些常见的Linux系统命令行知识,以及命令提示符中的一些符号的含义。 1. 命令行界面 在Linux系统中,命令…...

Python 面向对象编程笔记:中级面向对象

__super__() 在 Python 中&#xff0c;super 是一个内置函数&#xff0c;用于调用父类方法。该函数可以在子类中调用父类中被重写的方法&#xff0c;从而实现对父类方法的继承并且进行扩展。它能够动态地查找当前子类继承链中的下一个类&#xff0c;从而允许设计者更加灵活地…...

JVM学习笔记(上)

1、总体路线 2、程序计数器 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记录下一条 jvm 指令的执行地址行号。 特点&#xff1a; 是线程私有的不会存在内存溢出 解释器会解释指令为机器码交给 cpu 执行&#xff0c;程序计数器会…...

反爬虫技术

预计更新 一、 爬虫技术概述 1.1 什么是爬虫技术 1.2 爬虫技术的应用领域 1.3 爬虫技术的工作原理 二、 网络协议和HTTP协议 2.1 网络协议概述 2.2 HTTP协议介绍 2.3 HTTP请求和响应 三、 Python基础 3.1 Python语言概述 3.2 Python的基本数据类型 3.3 Python的流程控制语句 …...

JAVA中.equals()与 ==的区别

1. “”是运算符&#xff0c;如果是基本数据类型&#xff0c;则比较存储的值&#xff1b;如果是引用数据类型&#xff0c;则比较所指向对象的地址值。 2..equals() equals是Object的方法&#xff0c;比较的是所指向的对象的地址值&#xff0c;一般情况下&#xff0c;重写之后比…...

华为OD机试之羊、狼、农夫过河(Java源码)

羊、狼、农夫过河 题目描述 羊、狼、农夫都在岸边&#xff0c;当羊的数量小于狼的数量时&#xff0c;狼会攻击羊&#xff0c;农夫则会损失羊。农夫有一艘容量固定的船&#xff0c;能够承载固定数量的动物。 要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。只计算…...

C++ string的简单应用

C语言的字符串 C的字符串 头文件&#xff1a; #include<string.h> //c #include<string> //C #include<cstring> //C 比较string的大小 两个string对象相加 使用字符串对象来存放字符串 两个string对象相加 string str "Hello,"; st…...

Java中的阻塞队列

阻塞队列的基本概念 1、生产者、消费者的概念 他俩是设计模式的一种&#xff0c;提出这两种概念&#xff0c;通过一个容器的方式能解决强耦合问题 生产者、消费者之间不会直接通讯。通过一个第三方容器、队列的方式进行通讯 生产者生产完数据放入容器之后&#xff0c;不用等待消…...

PriorityBlockingQueue无界阻塞优先级队列

PriorityBlockingQueue无界阻塞优先级队列 PriorityBlockingQueue 是带优先级的无界阻塞队列&#xff0c;每次出队都返回优先级最高的元素&#xff0c;是二叉树最小堆的实 现&#xff0c;研究过数组方式存放最小堆节点的都知道&#xff0c;直接遍历队列元素是无序的。 如图 P…...

「HTML和CSS入门指南」p 标签详解

<p> 标签是什么? HTML5 中的 <p> 标签是用于定义段落的标签。它可以用来标记文章、新闻等长篇内容中的段落,并且可以与其他 HTML 元素配合使用。 <p> 标签的语法和属性 <p> 标签的语法非常简单,只需要在 HTML 文件中插入 <p> 和 </p>…...

【单目标优化算法】孔雀优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

chatgpt赋能python:Python同一行多个语句:如何提高你的编程效率?

Python同一行多个语句&#xff1a;如何提高你的编程效率&#xff1f; Python是一种优雅的编程语言&#xff0c;拥有简洁易懂的语法&#xff0c;可以帮助你快速编写可以在各种领域使用的高级代码。其中&#xff0c;Python同一行多个语句&#xff0c;是一种可以大大提高编程效率…...

Java反射概述

2 反射 2.1 反射概述 Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展2.2 反射获取Class类的对象 我们要想通过反…...

《网络是怎样连接的》(一)

第一章web浏览器 简介 首先输入网址URL&#xff0c;浏览器进行解析&#xff0c;将我们需要哪些数据告诉服务器。浏览器向服务器发送消息&#xff0c;必须告诉操作系统的接收方的IP地址&#xff0c;所以浏览器先查出web服务器的IP地址&#xff0c;向DNS服务器查询域名对应的IP…...

Flink on yarn任务日志怎么看

1、jobmanager日志 在yarn上可以直接看 2、taskmanager日志 在flink的webui中可以看&#xff0c;但是flink任务失败后&#xff0c;webui就不存在了&#xff0c;那怎么看&#xff1f; 这是jobmanager的地址 hadoop02:19888/jobhistory/logs/hadoop02:45454/container_e03_16844…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...