提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、名称空间
什么是名称空间?即用来存放名字与对象映射/绑定关系的地方。对于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