函数2

函数的命名空间:

  >内置: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()

知其然,更要知其所有然.本着技多不压身的原则,了解多一点,再了解多一点.

posted @ 2019-07-10 15:12  去遇见最好的自己  阅读(276)  评论(0编辑  收藏  举报