python名称空间详解

本文详细解释了Python中名称空间的作用,包括全局、局部和内置名称空间的区别,以及变量查找的顺序规则。它强调了如何避免变量名冲突,并通过实例说明了函数名的存储位置。
摘要由CSDN通过智能技术生成

首先,需要明确的是名称空间的作用,在python中,我们知道当变量名创建之后,变量名是存放在栈区中的,也就是id是放在栈区中的,而变量对应的值是存放在堆区中的,当调用变量的时候便是直接在栈区中查找是否有对应的变量名,从而根据栈区中变量名对应的内存地址在堆区中找到相应的变量值。从而完成调用。

在为变量命名的时候我们会在不经意间创建了相同名称的变量名,这时,当我们需要用到这个变量的时候,计算机并不知道我们需要的时哪个变量。所以这时,名称空间就起到了作用。名称空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个名称空间中不能有重名,但不同的名称空间是可以重名而没有任何影响。例如:在计算机文件目录中,同意路径下不能存在相同名字的文件(夹),但是在不同的路径下可以存在相同名字的文件(夹)。可以这样理解:名称空间是对栈区的划分,从而更好的调用变量,避免的变量名重复的时候导致的问题。


  • 内置名称空间
  • 全局名称空间
  • 局部名称空间
  • 查找变量的顺序

一,内置名称空间

内置空间中保存着Python内置的变量对象(如 print函数, list对象等 ), 内置命名空间由Python解释器创建和销毁, 只要python程序在运行, 内置空间的变量就是生效的. 如:任何时候都可以调用print函数,或者在直接打印函数名时会返回的时函数调用。可以通过dir(__builtins__)来查看在内置空间中有哪些信息,这里截图有限,同时自己可以打印出来看看。

 二,全局名称空间

 全局名称空间在python文件运行的时候创建好,直到python解释器终止,其中包含主函数体中的任何定义的名称变量和从其他模块import的内容。

1,当没有定义input的值时会直接返回内置空间中input的调用,显示当前input是一个函数。

2,当定义了input的值后,再次调用input时就会是不一样的结果。

这就是在全局名称变量中定义了input的值,这时当打印input的值时,并不会直接显示input是一个函数,而是显示出当前定义的input的值。至于是怎么查找到的变量值后面会讲解。

三,局部名称空间 

 在自定义函数中创建的变量名会存放在局部名称空间中,当函数体在被执行的时候创建出局部名称空间,当函数体返回值后该空间会被回收。当再次执行函数的时候再次创建出。

这里中,在函数体外的input值存放在全局名称空间中,而函数体中的input值存放在局部名称空间中,因而当同时打印input的值时会打印出两个值。

四,查找变量的顺序

当变量定义后必然是要调用变量的,所以这就需要理解在名称空间中是怎么调用变量值的。

查找调用变量顺序:局部名称空间 ---> 全局名称空间 --->  内置名称空间。

查找调用变量值时,必然是现在当前的名称空间中查找是否存在变量值当没有的时候在像上一级中查找,当最后在内置名称空间中都没有找的话就表示没有找到变量值,从而报错。

为了便于理解,名称空间只存在优先级,并不存在嵌套关系。如下图:(注:在物理空间存储中并不是这样的,物理空间中并不存在嵌套关系

那么可能会有这样的疑问了:如果当前是在全局名称空间中,那么是怎么样来查找变量从而调用的呢?难道会找到局部名称空间中吗?

事实上,当在当前名称空间中没有找到的话就会直接到上一级的名称空间中去寻找变量。所以当前如果在全局名称空间中的话,没有在全局名称空间中找到的话会直接到内置名称空间中寻找,如果没有找到变量名的话就表示没有该变量名,从而直接报错。

这里就是一个很好的代码示例,在函数体(或者是局部名称空间)中并没有创建变量input的值,但是在调用函数的时候还能查找到变量的值的。当前变量input是定义在全局名称空间中的。在局部名称空间中没有找到,从而向上一级的全局名称空间查找,从而打印出input的值。这里假如说并没有在全局名称空间中定义input的值的话会直接打印出input函数的内置地址。

那么还有一个疑问,当我们在定义函数体的时候,函数名的地址是存放在全局名称变量中还是存放在局部名称空间中呢?事实上,当我们在定义函数体时,函数体中存在我们创建变量名,则这些变量名则存放在局部名称空间中,当函数体执行完之后就会释放局部名称空间,而函数名的地址则是存放在全局名称空间中,因为当我们编译好python文件后,当开始执行python文件之后python解释器并不是直接开始解释python代码,而是存在一个阶段来查看python文件中是否存在语法错误,这个时候就会创建好全局名称空间用来存放顶级代码(也就是没有缩进位的代码),需要知道的是,当函数体没有执行的时候是不会占用空间的,所以当前函数体并没有占用空间,也就是说python解释器知道存在这样的一个函数,但是并不知道这个函数是干什么的。所以会将这个函数名对应的内存地址存放在全局名称空间。 

名称空间在物理上的存储为:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇见陌生人了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值