

??例如我们常用的内置函数
print
len
input
x = 1      #全局名称空间
def foo(): #全局名称空间
	y = 2
??注意,"if"下面的定义的变量名都是全局的
if 1 > 0        
	z = 3        #全局
	if 3 > 0: 
		p = 555  #全局
def f()
	x = 222    #局部名称空间
    
f()   #函数调用结束失效
‘内置名称空间‘----->‘全局名称空间‘----->‘局部名称空间‘
‘局部名称空间‘----->‘全局名称空间‘----->‘内置名称空间‘
‘局部名称空间‘----->‘全局名称空间‘----->‘内置名称空间‘
重要概念:名称空间的嵌套关系是在函数定义阶段(检测语法)时确定的,与函数调用的位置无关,与函数定义位置有关
三种名称空间必须要有的是 : 内置名称空间, 全局名称空间
查找优先级示例
??从"f2"局部开始找
x = 3
def f1():
    x = 2
    def f2():
        x =1
        print(x)
    f2()
f1()  # 1
??将"f2"局部的删除,就往上一层找,找到"f1"
x = 3
def f1():
    x = 2
    def f2():
        print(x)
    f2()
f1()  # 2
??再将"f1"里面的删除,于是找到了全局
x = 3
def f1():
    def f2():
        print(x)
    f2()
f1()  # 3
??在定义"f2"的之后,有定义了同一级别的"len",所以当打开函数"f2"运行的时候,本着优先级查找就先找到了"222"
len = 111
def f1():
    def f2():
        print(len) # 222
	len = 222
    f2()
f1()  # 222
??在全局空间定义一个变量"x",函数"foo",在函数内部修改"x"的值
x = 111
def foo():
    x = 222
    
foo()
print(x)   #111
#发现并无软用
??使用"global"关键字之后
x = 111
def foo():
    global x  # 声明下面的"x"属于全局
    x = 222
    
foo()
print(x)  #222
#发现成功了
??不做任何处理,此函数应该是打印"f2"函数下的"x = 333"
x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            x = 444
        f3()
        print(x)  #333
    f2()
f1()  # 333
??使用"nonlocal"关键字
x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            nonlocal x  #将下面的"x = 444"变成了上一层的"x"的值
            x = 444
        f3()
        print(x) 
    f2()
f1()  # 444
??如果外层函数都没有"x"这个值,报错
x = 111  #并不会去全局修改
def f1():
    def f2():
        def f3():
            nonlocal x
            x = 444
        f3()
        print(x)
    f2()
f1()  #报错
原文:https://www.cnblogs.com/songhaixing/p/14051159.html