浅析Python的命名空间与作用域

作者:kangyz 时间:2022-11-27 04:19:04 

名称空间

名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区的划分
作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突
名称空间分为三种:

  • 内置名称空间

  • 全局名称空间

  • 局部名称空间

内置名称空间

  • 内置名称空间:用于存放Python解释器中内置的名字

  • 生命周期:Python解释器启动则产生,Python解释器关闭则销毁

  • 例如:print、input、int ...

全局名称空间

  • 全局名称空间:运行顶级代码所产生的名字,或者说除函数内定义以及内置的外,剩下的都是全局名称空间

  • 生命周期:Python文件执行时产生,Python文件执行完毕后销毁

  • 例如:


# 变量名a
a = 1

# 函数名func
def func():
 pass

# 类名MyClass
class MyClass:
 pass

局部名称空间

局部命名空间:在调用函数时,运行函数体代码过程中产生的函数内的名字
生命周期:函数调用时产生,函数调用完毕后销毁
例如:


def func(x, y):
 pass

func(1, 2)

名称空间的先后顺序

  • 名称空间加载顺序:内置名称空间 -> 全局名称空间 -> 局部名称空间

  • 名称空间销毁顺序:局部名称空间 -> 全局名称空间 -> 内置名称空间

  • 名字的查找优先级:从当前所在位置向上一层一层查找

作用域

全局作用域

全局作用域:内置名称空间、全局名称空间

特点:

  • 全局存活

  • 全局有效:被所有函数共享

局部作用域

局部作用域:局部名称空间

特点:

  • 临时存活

  • 局部有效:函数内有效

LEGB原则

找寻变量的调用顺序采用LEGB原则(即就近原则)
B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)
G —— Global(module); 函数外部所在的命名空间 (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
L —— Local(function);当前函数内的作用域 (局部作用域)
依据就近原则,从下往上 从里向外 依次寻找

global与nonlocal

  • global:声明全局变量获修改全局变量

  • nonlocal:修改局部变量(当前函数上一层的局部变量)


# global的使用
x = 1
def func():
 global x
 x = 2
func()
print(x)

# nonlocal的使用
def func1():
 x = 1
 def func2():
   nonlocal x
   x = 2
 func2()
 print(x)
func1()

总结

  • 名称空间是对栈的一种划分,真正存在的是栈区。名称空间只是一种虚拟的划分

  • 名称空间只有优先级之分,并无没有嵌套关系

  • 名称空间的“嵌套关系”决定了名字的查找顺序

  • 名称空间的“嵌套关系”以函数定义阶段为准

来源:https://segmentfault.com/a/1190000038273514?utm_source=tuicool&utm_medium=referral

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

猜你喜欢

  • 一个滑动展示的小代码

    2011-07-01 12:58:05
  • CSS属性behavior的语法及介绍

    2010-01-13 12:40:00
  • mysql如何跨时区迁移数据

    2010-03-25 10:26:00
  • Python实现批量识别图片文字并存为Excel

    2021-07-28 06:34:23
  • mssql2005,2008导出数据字典实现方法

    2023-07-23 19:11:30
  • eWebEditor不支持IE8/IE7的解决方法

    2010-02-28 10:27:00
  • 从IIS到SQL Server数据库安全

    2008-12-24 15:58:00
  • PHP结构型模式之代理模式

    2023-05-25 06:55:34
  • 详解PHP设计模式之桥接模式

    2023-05-30 10:29:02
  • ASP中生成文本文件的两种方式

    2008-04-30 19:33:00
  • 使用PHP实现微信摇一摇周边红包

    2023-11-14 12:04:22
  • (小技巧)复制消息对话框的内容

    2008-10-21 10:51:00
  • H5+css3+js搭建带验证码的登录页面

    2023-08-30 16:15:54
  • 微信小程序开发工具介绍

    2023-08-10 23:05:40
  • asp 删除数据并同时删除图片的代码

    2011-02-28 10:39:00
  • jsp自定义标签之ifelse与遍历自定义标签示例

    2023-06-25 21:09:34
  • asp如何取回已忘记的密码?

    2010-05-13 16:33:00
  • oracle数据排序后获取前几行数据的写法(rownum、fetch方式)

    2023-07-02 01:15:09
  • Oracle 存储过程教程

    2009-10-24 18:05:00
  • 巧妙规划使用Oracle数据空间

    2009-03-20 11:51:00
  • asp之家 网络编程 m.aspxhome.com