名称空间与作用域

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、名称空间

什么是名称空间?即用来存放名字与对象映射/绑定关系的地方。对于x = 3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,delx表示清除该绑定关系。
在程序执行过程中,会存在三种名称空间

1.1 内置名称空间

伴随python解释器的启动/关闭而产生/回收,因而是第一个被加载的名称空间,用来存放一些内置的名字,比如内置函数

>>> max
<built-in function max>

1.2 全局名称空间

伴随python文件的开始执行/执行完毕而产生/回收,是第二个被加载的名称空间,文件执行过程中产生的名字都会存放于该名称空间

1.3 局部名称空间

伴随函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间

name = "小猿圈"  # 全局变量

def outter():
    name = "小猿圈,自学编程"  # 局部变量
    print("局部变量函数调用:",name)

outter()
print("全局变量文件调用:",name)

#局部变量函数调用: 小猿圈,自学编程
#全局变量文件调用: 小猿圈

小结:
名称空间的加载顺序:内置名称空间>>全局名称空间>>局部名臣空间
名称空间的查找顺序:局部名称空间>>全局名称空间>>内置名称空间
数据逐级向外查找

二、作用域

2.1 全局作用域与局部作用域

按照名字作用范围的不同可以将三个名称空间划分为两个区域:
1、全局作用域:内置名称空间、全局名臣空间属于全局作用范围,该范围内的名字全局存活,全局有效;
2、局部作用域:局部名称空间属于局部范围,该范围的名字临时存活,局部有效。

2.2 作用域与名字查找的优先级

在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,如果没有找到,再去全局作用域查找,还没有找到就在内置名称空间中查找,都没有找到就会抛出异常。查找顺序:局部名称空间>>全局名称空间>>内置名称空间

x = 100  # 全局变量
def foo():
    x = 300  # 局部变量
    print(x)
foo()  # 调用局部变量
print(x)  # 调用全局变量

#300
#100

x = 100  # 全局变量
def foo():
    print(x)
foo()  # 无局部变量,调用全局变量
#100

可以调用内建函数locasl()和globals()来分别查看局部作用域和全局作用域的名字,查看的结果都是字典格式。在全局作用域查看到的locals()的结果等于globals()

def foo():
    name = "rose"
    gender = "female"
    print(locals())   #  {'name': 'rose', 'gender': 'female'}
    print(globals())  # pass
foo()

同时,可以利用global在局部名称中声明全局变量(了解,不推荐使用)

def foo():
    global name  # 在函数内部声明(创建)一个全局变量
    name = "hahaha"
    age = 23
    print(name)

foo()
print(name)

#hahaha
#hahaha
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值