编程语言
首页 > 编程语言> > Python 基础(十八):命名空间 & 作用域

Python 基础(十八):命名空间 & 作用域

作者:互联网

1 命名空间

1.1 概念

命名空间(namespace)是名称到对象的映射,当前大部分命名空间都是通过 Python 字典来实现的,它的主要作用是避免项目中的名字冲突,每一个命名空间都是相对独立的,在不同的命名空间中可以同名,在相同的命名空间中不可以同名。

1.2 种类

命名空间主要有以下三种:

1.3 生命周期

通常在不同时刻创建的命名空间拥有不同的生命周期,看一下三种命名空间的生命周期:

2 作用域

2.1 概念

作用域是 Python 程序可以直接访问命名空间的文本区域(代码区域),名称的非限定引用会尝试在命名空间中查找名称,作用域是静态的,命名空间是随着解释器的执行动态产生的,因此在作用域中访问命名空间中的名字具有了动态性,即作用域被静态确定,被动态使用。

2.2 种类

Python 有如下四种作用域:

作用域的搜索顺序通过下图直观的来看一下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

Python 中会按上图所示作用域由内向外去搜索名字。

再通过具体代码来对作用域作进一步了解,如下所示:

# 全局作用域g = 1def outer():    # 嵌套作用域    e = 2    def inner():        # 局部作用域        i = 3

2.3 global & nonlocal

我们先来看一下全局变量与局部变量。

全局变量可以在整个程序范围内进行访问,而局部变量只能在函数内部访问。通过具体示例看一下:

# 全局变量d = 0def sub(a, b):    # d 在这为局部变量    d = a - b    print('函数内 : ', d)
sub(9, 1)print('函数外 : ', d)

执行结果:

函数内 :  8函数外 :  0

当内部作用域想要修改外部作用域的变量时,就要用到 global 和 nonlocal 关键字了,下面通过具体示例来了解一下。

如果我们想将上面示例中 sub() 函数中的 d 变量修改为全局变量,则需使用 global 关键字,示例如下所示:

# 全局变量d = 0def sub(a, b):    # 使用 global 声明 d 为全局变量    global d    d = a - b    print('函数内 : ', d)
sub(9, 1)print('函数外 : ', d)

执行结果:

函数内 :  8函数外 :  8

如果需要修改嵌套作用域中的变量,则需用到 nonlocal 关键字。

不使用 nonlocal

我们先来看一下不使用 nonlocal 关键字的执行情况,如下所示:

def outer():    d = 1    def inner():        d = 2        print('inner:', d)    inner()    print('outer:', d)outer()

执行结果:

inner:2outer:1

使用 nonlocal

再来看一下使用了 nonlocal 关键字的执行情况,如下所示:

def outer():    d = 1    def inner():        nonlocal d        d = 2        print('inner:', d)    inner()    print('outer:', d)outer()

执行结果:

inner:2outer:2

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 



标签:函数,作用域,十八,print,nonlocal,Python,inner,命名
来源: https://blog.51cto.com/u_15283574/2951212