Python基础教程之名称空间以及作用域

作者:DgLink 时间:2022-08-10 07:51:47 

前言

所谓“基础不狠,人站不稳”,对于任何一种编程语言来说基础往往都是重中之重,以Python为例,其中的两大分水岭就是函数编程和面向对象,而今天所要巩固的知识点后续会多次使用,那就是名称空间和作用域

名称空间

什么是名称空间

在Python中名称空间是用存储对象和名字绑定关系的地方,那么问题来了,什么是对象,什么是名字,什么是绑定关系?

1)在目前,我们对于对象的认知可以暂时只停留在人云亦云的“Python中一切都是对象”基础上,函数是对象、类是对象、变量,模块、所有一切都是对象,有这样的认知就可以了,后续有机会将继续补充;

2)名字,很简单,每一次我们对模块、变量、函数、类的定义都需要取名字,而这些名字都会放在名称空间之中;

3)Python对于名字和数据之间给出了绑定关系,举个例子,当我们在定义a = 6时,Python就自动将变量a这个名字与6这个对象给出了绑定关系,我们可以使用del语句将绑定关系解除。

明白了名称空间是用于存储对象和名字绑定关系的地方,那么接下来就可以细致了解一下名称空间可以分为哪几类了:

1)内置名称空间 —— 用于存放各种内置函数(built-in functions)、内置模块(built-in modules),例如abs()就是内置函数,内置名称空间可以在Python任何一处使用;

2)全局名称空间 —— 全局名称空间中的名字可以在同一个模块中任意处使用;

3)局部名称空间 —— 局部名称空间中的名字仅仅只能够在函数内部使用。

名称空间的意义

名称空间最大的作用就是防止名字重复造成的引用不当,我们可以在全局名称空间中定义一个a = 6同时也可以在局部名称空间中定义一个a = 7,这两者之间是不会产生任何冲突的,这就是名称空间最大的作用,防止名字重复造成的引用不当。

名称空间的查找顺序

知道了名称空间的意义,那么肯定会有读者意识到,我在全局定义一个a = 6,在局部定义一个a = 7,那么接下来调用a这个名字的时候,Python究竟会从哪个空间开始寻找a所对应的对象呢?

我只能说,这位读者你很上道,我们将以实例解答这个问题;

a = 6              # 在全局名称空间中定义一个a
b = 8            # 在全局名称空间中定义一个b,为了测验调用函数时能否找到全局中的b
def test():
   a = 7        # 在局部名称空间中定义一个a
   return a,b
print(test())
print(a)    

(7,8)
6

从以上我们的测验中,调用函数test时输出的a将会是7,而当直接使用print(a)时输出的a将会是6。

所以我们可以大胆的下结论:

1)当调用函数的时候,函数寻找名字的顺序将会是 局部名称空间—>全局名称空间—>内置名称空间;

2)当没有调用函数,直接使用名字的时候查找顺序就是 全局名称空间 —>内置名称空间;

3)只要在某个名称空间(局部也好、全局也罢)中找到了对应的名字,就停止寻找;

4)在不同名称空间中定义相同名字是可行的,后续定义的并不会将原先覆盖掉。

局部名称空间详解

在局部名称空间中有一个非常神奇的事情,因为函数是可以相互嵌套的,在一个函数中嵌套另外一个函数是很正常的现象:

def test_1():           # 定义一个函数
   def test_2():       # 在test_1中定义一个嵌套函数
       print('球球好心人给个赞吧')
# 这是最简单的函数嵌套,
# 但也是最不规范的函数嵌套,
# 因为如果不改进的话,则无法使用嵌套的test_2函数

来源:https://blog.csdn.net/DgLink/article/details/122390428

标签:python,作用域,命名空间
0
投稿

猜你喜欢

  • 用户体验量化方法研究(二)

    2010-02-08 12:46:00
  • 跟老齐学Python之用while来循环

    2021-01-13 23:38:18
  • Python Tkinter Menu组件详解

    2021-07-24 06:51:18
  • python 如何调用 dubbo 接口

    2022-09-28 13:20:13
  • sql2000如何完美压缩.mdf文件

    2010-03-03 15:47:00
  • python解析多层json操作示例

    2021-06-17 22:59:41
  • SQL Server 触发器实例详解

    2024-01-28 05:40:46
  • Django+Ajax异步刷新/定时自动刷新实例详解

    2023-11-29 11:28:15
  • python datetime中strptime用法详解

    2022-03-08 19:31:48
  • JS基于开关思想实现的数组去重功能【案例】

    2024-04-17 10:31:02
  • javascript事件冒泡,事件捕获和事件委托详解

    2024-04-10 14:02:47
  • 在pycharm中无法import所安装的库解决方案

    2021-10-20 02:50:11
  • 浅谈Python的Django框架中的缓存控制

    2022-01-23 10:56:24
  • go 字符串修改的操作代码

    2024-05-13 10:40:18
  • Python+PyQT5实现手绘图片生成器

    2022-03-11 11:57:21
  • mysql group by having 实例代码

    2024-01-17 09:34:48
  • 基于Python计算圆周率pi代码实例

    2021-03-06 05:13:17
  • javascript实现获取浏览器版本、操作系统类型

    2024-05-13 10:36:21
  • Oracle中字符串连接的实现方法

    2024-01-15 11:59:24
  • SQL SERVER 2012新增函数之逻辑函数IIF

    2024-01-16 05:39:46
  • asp之家 网络编程 m.aspxhome.com