一,命名空间
本质是一个字典,记录变量名称和值。
可以局部命名空间(记录的参数以及在函数体中的声明变量),全局命名空间(整个py文件中的变量和函数),内置空间(记录的内置函数)
命名空间的顺序:
先从局部命名空间查找,再找全局空间,最后查找内置空间;
如果开始从全局命名空间查找,如果找不到想内置空间找,若找不到就报错
注意自己的变量名称不要和内置的变量名称相同否则会失效:
二,作用域:
变量的可用范围
根据变量声明的位置不同作用域可分为四类:
Local(函数内部)局部作用域。
Enclosing(嵌套函数的外层函数内部)嵌套作用域(闭包)。
Global(模块全局)全局作用域。
Built-in(内建)内建作用域。
局部作用域---->函数中声明的变量
嵌套作用域—>嵌套函数中外层函数体声明的变量
局部作用域---->py文件中的声明的变量
内置作用域---->python提供的变量(函数)
调用变量:
局部—>嵌套—>全局—>内置
使用变量:
局部<—嵌套<—全局<—内置
变量的搜索顺序:
a= 1
def outter():
a = 10
def inner():
a = 20
print(a) #20,10,1
inner()
outter() #由内到外
全局和嵌套进行修改:
global a
nonlocal a
1
a =20
def func():
global a #对a进行修改,对全局进行修改
a=30
print(a) #所有id相同
func()
print(a)
2
def outter():
name='zs'
def inner():
nonlocal name #重新开辟一个空间,只能修改嵌套里面的
name = 'ww'
print(name)
inner()
print(name)
outter()
3
#nonlocal
name = 'zs'
def func1():
name = 'ls'
def func2():
nonlocal name
name='ww'
print('func2的name---->',name)
func2()
print('func1的name--->',name)
func1()
print(name) #zs 全局变量不会被修改
命名空间与作用域的关系
命名空间在每个作用域内变量名也绑定值一一对应,
作用域是变量作用的范围
def func(c):
a=10
b =20
print(locals()) #{'c': 40, 'b': 20, 'a': 10} 把c :40 添加到列表里
func(40)