河池市网站建设_网站建设公司_博客网站_seo优化
2026/1/3 17:38:24 网站建设 项目流程

文章目录

  • 前言
  • 一、命名空间
    • 1.1 什么是命名空间?
    • 1.2 命名空间的三种类型
    • 1.3 命名空间的生命周期
  • 二、作用域
    • 2.1 作用域与命名空间的关系
    • 2.2 作用域的四种类型(LEGB规则)
    • 2.3 访问不同作用域的变量
    • 2.4 总结对比

前言

本文主要介绍命名空间与作用域的概念和关系等相关知识。


一、命名空间

1.1 什么是命名空间?

命名空间可以理解为变量名和其对应对象之间的映射关系。Python 使用字典来实现命名空间,确保不同上下文中的名称不会冲突。

  • 简单比喻:命名空间就像公司里的工牌系统
  • 不同部门可以有同名员工(不同命名空间可重名)
  • 同一部门不能有同名员工(同一命名空间不可重名)
python# 示例:不同命名空间中的同名变量不会冲突deffunc1():x=10# func1的局部命名空间print(f"func1中的x:{x}")deffunc2():x=20# func2的局部命名空间(与func1的x无关)print(f"func2中的x:{x}")global_x=30# 全局命名空间func1()# 输出: func1中的x: 10func2()# 输出: func2中的x: 20print(f"全局的x:{global_x}")# 输出: 全局的x: 30

1.2 命名空间的三种类型

类型内容示例
内置命名空间Python内置函数、异常print(), len(), ValueError
全局命名空间模块级别定义的名称模块变量、函数、类
局部命名空间函数内部定义的名称参数、局部变量
python# 内置命名空间:Python启动时自动创建print("内置函数示例:",abs(-5),len([1,2,3]))# 全局命名空间:模块级别定义GLOBAL_VAR="我是全局变量"defglobal_func():return"我是全局函数"# 局部命名空间:函数内部定义deflocal_example(param):local_var="局部变量"print(f"参数:{param}, 局部变量:{local_var}")

1.3 命名空间的生命周期

命名空间类型创建时间销毁时间
内置命名空间Python解释器启动时Python解释器退出时
全局命名空间模块被导入时Python解释器退出时
局部命名空间函数被调用时函数执行结束或异常退出
python# 演示局部命名空间的生命周期defcounter():"""每次调用都会创建新的局部命名空间"""count=0# 每次调用时重新创建count+=1returncountprint(counter())# 输出: 1print(counter())# 输出: 1(不是2,因为每次都是新命名空间)

二、作用域

2.1 作用域与命名空间的关系

作用域是代码中可以访问某个命名空间的区域,而命名空间是变量存储的容器。

  • 关键区别:
    作用域是静态的:由代码结构决定,在编写时就固定了
    命名空间是动态的:在程序运行时创建和销毁
python# 作用域的静态性示例defouter():x="outer"# outer函数的作用域definner():print(x)# 可以访问outer的x(作用域嵌套)returninner func=outer()func()# 输出: outer(即使outer已执行完,inner仍记得x)

2.2 作用域的四种类型(LEGB规则)

Python按照 LEGB规则 搜索变量:

python# L: Local 局部作用域(函数内部)# E: Enclosing 嵌套作用域(外层函数)# G: Global 全局作用域(模块级别)# B: Built-in 内置作用域# 内置作用域 (B)# print, len, abs 等内置函数# 全局作用域 (G)global_var="global"defouter():# 嵌套作用域 (E)enclosing_var="enclosing"definner():# 局部作用域 (L)local_var="local"# Python按 LEGB 顺序搜索变量:# 1. 先在 Local 作用域查找 local_var# 2. 再到 Enclosing 作用域查找 enclosing_var# 3. 再到 Global 作用域查找 global_var# 4. 最后到 Built-in 作用域查找内置名称print(local_var)# 找到print(enclosing_var)# 找到print(global_var)# 找到print(len([1,2,3]))# 使用内置函数inner()outer()

2.3 访问不同作用域的变量

python# 访问全局变量(需声明 global)count=0defincrement():globalcount# 声明使用全局变量count+=1returncountprint(increment())# 1print(increment())# 2# 访问嵌套作用域变量(需声明 nonlocal)defouter():counter=0definner():nonlocalcounter# 声明使用外层变量counter+=1returncounterreturninner closure=outer()print(closure())# 1print(closure())# 2

2.4 总结对比

特性命名空间作用域
本质名称到对象的映射可访问命名空间的代码区域
实现字典结构代码结构决定
特性动态创建/销毁静态确定
关系容器(存储变量)权限(访问变量)
  • 记忆口诀:
    命名空间:变量住在哪里
    作用域:你能访问哪些地方
    LEGB规则:从里到外找变量

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询