1 命名空间
命名空间是用来存放名字与对象绑定关系的。比如a=1,Python会申请内存空间存放对象1,然后将x与1的绑定关系存放在命名空间中。Python的命名空间是相互独立的。同一命名空间中不能有重名,不同的命名空间中可以有重名。就像同一个文件夹下不能存在相同的文件名,但不同的文件夹下可以存在相同的文件名。
Python中的三种命名空间
- 内置命名空间(built-in):存放Python的内置函数
- 全局命名空间(global):模块中定义的变量,函数,类
- 局部命名空间(local):函数中定义的变量
命名空间的加载顺序:内置、全局、局部
命名空间的查找顺序:局部、全局、内置
2 作用域
作用域就是Python程序中可以访问变量的区域,Python中一共有4种作用域
- local:函数内部
- enclosing:在嵌套函数中inner嵌套在outer里面,则对inner而言,outer的命名空间就是enclosing
- global: 模块中的变量
- built-in: Python内置函数
查找顺序:L-E-G-B 由里向外找
3 全局变量与局部变量
局部变量:定义在函数内部的变量,只能在函数内部访问
全局变量:在py文件中定义在函数外部的变量,在该py文件内部都可以访问
num = 1
a = "abc"
def talk():
num = 2
print(num) #函数内部定义了变量num,这里的num为2
print(a) #函数内部没有定义变量a,则会到函数外面去找变量a,这里的a就是在函数外部定义的变量a为“abc”
print(num) #在函数外部调用全局变量a
print(a)
talk()
结果为
1
abc
2
abc
如果我们想在函数内部修改函数外部的变量,这时候就需要用到global和nonlocal关键字
num = 1
def talk():
global num # 在函数内部声明全局变量
num = 2
talk()
print(num) # 此处的输出结果为2
在嵌套函数中则使用nonlocal关键字
def outer():
num = 1
print("out函数中的num=",num)
def inner():
nonlocal num
num = 2
inner()
print("out函数中的num=", num)
结果为
out函数中的num= 1
out函数中的num= 2