名称空间

  名称空间分为三种:

          内建名称空间

          全局名称空间

          局部名称空间

  内建名称空间

    第一个被加载的名称空间,存储一些内置的名称

  全局名称空间

    第二个被加载的名称空间,文件执行过程中产生的变量名都会存放于全局名称空间

  局部名称空间

    函数的形参、函数内定义的名称都会存放在局部名称空间

作用域

  全局作用域、局部作用域

  全局作用域全局有效,在任意位置都可以使用

  局部作用域只能在函数中使用

作用域查找的优先级

  在局部作用域查找名字时,起始位置是局部作用域,所以先找局部名称空间,没有找到,再去全局作用域查找,先查找全局名称空间,没有找到,再去内置名称空间查找,最后都没有,就会抛出异常

x = 1  # 全局作用域的名字x


def foo():
    x = 2  # 局部作用域的名字x
    print(x)  # 在局部找x


foo()  # 结果为2

  在全局查找名字时,现在全局作用域查找,没有找到,再去内置名称空间查找,都没有找到,会抛出异常

x=100
def foo():
    x=300 #在函数调用时产生局部作用域的名字x
foo()
print(x) #在全局找x,结果为100

  如果要在函数内修改全局名称空间的变量值,并且这个全局的变量还是不可变类型时,可以用关键字global

x=1
def foo():
    global x #声明x为全局名称空间的名字
    x=2
foo()
print(x) #结果为2

  如果有多重嵌套的函数,想要修改非全局的变量时,要使用关键字nonlocal

def  f1():
    x=2
    def f2():
        nonlocal x
        x=3
    f2() #调用f2(),修改f1作用域中名字x的值
    print(x) #在f1作用域查看x

f1()  # 3