函数的命名空间:
>内置:python解释器内置的
>全局:自定义,整个文件内都可以访问.
>局部:只能在函数内使用,外部无法访问.
x1 = 100 #全局变量 def func(): x2 = 200 #局部变量 print(x1) #因为是全局变量,所以可以在函数内去访问 print(func()) print(x2) #因为是局部变量,所以无法从函数外部去访问NameError: name 'x2' is not defined
生命周期:
内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁
全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁
局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)
关于命名空间,还有一句很经典的致简名言:
""" 函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变 ---- jasonji """
def func(): x = 100 print(x) x = 200 func() #由于函数在定义时,print(x),就已经锁定了函数内的x=100,所以,无论在哪里调用,x都只会等于100. #而从另一个角度分析,func()函数内的x是定义在局部变量的命名空间内,而外部的x=200是定义在全局命名空间内,所以,再者并没有关系.再从一个简化的角度去理解,变量的查找顺序,总是会从离自己最近的地方开始找. #变量查找顺序:局部>>全局>>内置
其实由上面的一个小例子,就可以解开很多疑惑,理清很多思绪.在python内部,一切都是有紊紊有条的存放的.局部命名空间->>>全局命名空间->>>内置命名空间.搞清楚他们之间的规则,也就不会被繁杂的调用所混淆了.
关于函数的作用域:
global:局部修改全局 如果想修改多个 逗号隔开
x = 100 def func(): global x #改变全局命名空间内x的值 x = 200 func() print(x) #所以最终打印x的值是200
nonlocal:局部修局部 如果想修改多个 逗号隔开
def func1(): x = 100 def func2(): nonlocal x #改变当前局部命名空间内x的值 x = 200 func2() print(x) #所以打印x结果是200 func1()
知其然,更要知其所有然.本着技多不压身的原则,了解多一点,再了解多一点.