python命名空间详解

Python中的命名空间是编程语言设计的一个核心概念,它负责存储变量名与其对应的值之间的映射关系,确保了程序中变量的唯一性和可访问性。命名空间不仅关乎变量的生命周期和作用范围,也是Python中实现封装、避免命名冲突的重要机制。

1. 命名空间的基础

命名空间本质上是一个字典,其中键是变量名,值是变量所绑定的对象(可以是任何Python对象,如整数、字符串、列表、函数等)。每个Python程序在运行时都会创建一系列的命名空间来管理变量的存储和查找。

2. 命名空间的种类

全局命名空间
定义:每个Python模块(即.py文件)都有自己的全局命名空间,它存储了在模块级别定义的所有变量、函数、类等。
特点:
全局变量在整个模块内都是可见的。
在函数内部,可以直接访问全局变量,但修改全局变量时需要明确声明(使用global关键字)。
局部命名空间
定义:每当一个函数或类的方法被调用时,Python会为该函数或方法创建一个新的局部命名空间。
特点:
局部变量只在函数或方法内部有效,对外部不可见。
函数内部定义的变量默认为局部变量,除非显式声明为全局变量。
函数执行完毕后,局部命名空间会被销毁,释放资源。
内置命名空间
定义:这是Python解释器预定义的一个命名空间,包含了所有的内置函数和异常等。
特点:
内置命名空间对所有模块都是可用的,无需导入即可使用,如print(), len(), range()等。
它具有最低的优先级,在其他命名空间找不到变量时才会检查内置命名空间。

3. 作用域规则(LEGB)

作用域决定了在何处可以访问到一个变量。Python遵循LEGB规则来解析变量名,即从本地作用域开始向外查找:
L (Local): 当前函数或方法的局部命名空间。
E (Enclosing): 如果当前函数嵌套在另一个函数内,那么就是外层函数的局部命名空间。
G (Global): 当前模块的全局命名空间。
B (Built-in): 最后是Python的内置命名空间。

4. 命名空间的生命周期

全局命名空间:随着模块的加载而创建,当模块被卸载时销毁。
局部命名空间:函数调用时创建,函数执行结束时销毁。
内置命名空间:Python解释器启动时创建,直到解释器关闭才销毁。

5. 命名空间的交互

全局变量的修改:在函数内部修改全局变量需要使用global关键字声明,否则Python会将其视为一个新的局部变量。
nonlocal关键字:在嵌套函数中,若要修改外层但非全局作用域的变量,则需使用nonlocal关键字。

6. 命名空间的实践意义

避免命名冲突:通过隔离不同作用域的变量,即使不同作用域中有相同的变量名,也不会相互干扰。
模块化编程:每个模块有自己的命名空间,促进了代码的复用和模块间的独立性。
内存管理:局部命名空间的动态创建和销毁有助于高效管理内存资源,减少不必要的内存占用。

7. 实例分析

x = "global x"  # 全局命名空间def func():y = "local y"  # 局部命名空间print(x)       # 访问全局变量xprint(y)func()
print(x)
# print(y)  # 这将导致NameError,因为y不在全局命名空间中

在这个例子中,x属于全局命名空间,而y属于func函数的局部命名空间。函数调用时,Python首先在局部命名空间寻找变量,找不到时向上查找至全局命名空间,但不会访问到其他函数的局部命名空间。

结语

Python的命名空间和作用域机制是其强大和灵活特性的基石之一。正确理解和运用这些概念,可以帮助开发者编写更加清晰、健壮和易于维护的代码。通过合理划分变量的作用域,可以有效控制变量的可见性和生命周期,进而提升程序的结构和性能。

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

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

相关文章

ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O

一套11.2.0.4的rac库巡检,发现asm实例日志有如下报错 2.5.2 locate alert_${hst}.log tail -n 200 /oracle/app/grid/diag/asm/asm/ASM1/trace/alert_ASM1.log Errors in file /oracle/app/grid/diag/asm/asm/ASM1/trace/ASM1_ora_96212.trc: ORA-27090: Unable to…

利器放送丨如何在PS里使用stable diffusion插件?

各位设计界的领军人物们,你们一定对PS(也就是大家熟知的Photoshop)不陌生吧。同样,对于AI领域的精英们,SD(stablediffusion)这款软件也应该是如雷贯耳。这两款软件,各自独立且功能强…

c++题目_第K小的数(进阶)

第K小的数 时间限制: C/C 1s 其他语言 2s 空间限制: C/C 256MB 其他语言 512MB 题目描述 给定 nn 个正整数 a1,a2,…,ana1​,a2​,…,an​ 和 mm 个正整数 b1,b2,…,bmb1​,b2​,…,bm​。 请在 nmnm 个 aibj(1≤i≤n,1≤j≤m)ai​bj​(1≤i≤…

VSCode格式化插件-prettier

VSCode格式化插件 1.安装插件:prettier 2.设置默认格式化工具 设置中,搜索 “Default Formatter”。 在编辑器设置中,将默认格式化工具设为 Prettier。 3.启用格式化选项: 在设置中搜索 “Format On Save”,并勾选…

fastapi相关知识点回顾

poetry poetry是一个包管理工具,能够管理一个项目中python相关的依赖。 安装: pip install poetry初始化项目: poetry init添加依赖: poetry add fastapi这个命令相当于 pip instal fastatpi。 poetry使用国内源 poetry 默…

几种经典查找算法

几种经典查找算法 顺序查找法二分查找法判定树 二叉查找树(BST)索引查找B-树B树散列表(hash)查找 顺序查找法 顺序查找的平均查找长度为: 时间复杂度为0(n); 二分查找法 int bin…

vxe-table表格新增节点

做前端的朋友可以参考下&#xff1a;也可结合实际需求查看相应的官方文档 效果图 附上完整代码 <template><div><vxe-toolbar ref"toolbarRef" :refresh"{queryMethod: searchMethod}" export print custom><template #buttons>&…

算法训练营第六十天(延长12天添加图论) | LeetCode 647 回文子串、LeetCode 516 最长回文子序列

LeetCode 67 回文子串 思路很简单&#xff0c;每一个dp[i]等于dp[i-1]加上当前字符向前直到0各个长度字符串回文串个数即可 代码如下&#xff1a; class Solution {public boolean isValid(String s) {int l 0, r s.length() - 1;while (l < r) {if (s.charAt(l) ! s.ch…

MAC 下搭建LVGL仿真器

0.前置条件&#xff0c;保证电脑已经安装cmake&#xff0c;sdl2. 1. 下载仿真器代码&#xff1a;&#xff1a; git clone https://github.com/lvgl/lv_sim_vscode_sdl.git 2. 因为上面的仓库默认是没有lvgl源码&#xff0c;故cd 到lv_sim_vscode_sdl目录下&#xff0c;再下…

08:打印字符

OpenJudge - 08:打印字符 描述 输入一个ASCII码&#xff0c;输出对应的字符。 输入 一个整数&#xff0c;即字符的ASCII码&#xff0c;保证存在对应的可见字符。 输出 一行&#xff0c;包含相应的字符。 样例输入 65 样例输出 A >>>>>>分割线>>>>…

代码随想录算法训练营第三十八天| 509. 斐波那契数、70. 爬楼梯、 746. 使用最小花费爬楼梯

LeetCode 509. 斐波那契数 题目链接&#xff1a;https://leetcode.cn/problems/fibonacci-number/description/ 文章链接&#xff1a;https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html 思路 public int fib(int n) {// dp[i]表示第i个数…

Java 注解设计 -- Java 语言注解的介绍、高阶应用与自定义注解

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 012 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…

如何通过抖音自动评论精准获客实现业务增长?这些方法值得一试!

在当今竞争激烈的商业环境中&#xff0c;企业若想脱颖而出&#xff0c;就必须掌握精准获客的艺术。精准获客&#xff0c;即通过精确的市场定位和营销策略&#xff0c;吸引并保留最有可能成为客户的目标群体。它不仅能提高转化率&#xff0c;还能有效降低营销成本&#xff0c;是…

搭建自己的AI模型应用网站:JavaScript + Flask-Python + ONNX

1. 前言 本文作者以一个前端新手视角&#xff0c;部署自己的神经网络模型作为后端&#xff0c;搭建自己的网站实现应用的实战经历。目前实现的网页应用有&#xff1a; AI 语音服务主页AI 语音识别AI 语音合成AI CP号码生成器 欢迎大家试用感受&#xff0c;本文将以博客基于G…

linux信息查询

技术|17 种查看 Linux 物理内存的方法 apt install -y neofetch screenfetch glances glances 0x41 - 1.54/1.54GHz user system idle iowait steal MEM - 53.0% active 168M SW…

程序设计实践--4

数阵 矩阵加法 程序先输入两个整数m, n(0<=m,n<=100),分别表示矩阵的行数和列数,然后分别输入m行n列的两个矩阵A,B。 输出描述 输出矩阵相加的结果。 用例输入 1 3 4 1 2 3 4 5 6 7 8 1 0 1 0 3 4 2 1 4 6 7 9 3 4 2 0 用例输出 1 4 6 5 5 9 12 14 17 4 4 3 0 #…

机器人运动学笔记

一、建模 参考资料&#xff1a;https://zhuanlan.zhihu.com/p/137960186 1、三维模型和连杆、关节定义 2、设置z轴 SDH和MDH会不一样&#xff0c;主要的区别在于SDH中坐标系在连杆末端&#xff0c;MDH中坐标系在连杆首端。虽然这里只是给出z轴&#xff0c;但是由于后面原点位…

【C++】Template模板

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【计算机视觉】人脸算法之图像处理基础知识(五)

图像的几何变换 3.图像的旋转 图像的旋转就是让图像按照某一点旋转到指定的角度。需要确定3个参数&#xff1a;图像的旋转中心、旋转角度和缩放因子。在openv中通过getRotationMatrix2D()函数来实现图像的旋转。 import cv2 import numpy as npimgpath "images/img1.j…

datalist 是什么?

<datalist> 是 HTML5 中的一个元素&#xff0c;它用于提供一个“预定义”的选项列表&#xff0c;这些选项可供用户在 <input> 元素中使用。用户可以在列表中选择一个预定义的选项&#xff0c;或者直接输入其他值。<datalist> 元素与 <input> 元素一起使…