要点概括:

VariableScope-contents

对于变量作用域,变量的访问以L(Local)–>E(Enclosing)–>G(Global)–>B(Built-in)的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

1.局部作用域

观察如下例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
x = int(3.3)

x = 0
def outer():
    x = 1
    def inner():
        x = 2
        print(x)
    inner()

outer()  

程序输出结果为2,因为此时直接在函数inner()内部找到了变量x

2.闭包函数外的函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
x = int(3.3)

x = 0
def outer():
    x = 1
    def inner():
        i = 2
        print(x)
    inner()

outer()

程序输出结果为1,因为在内部函数inner()中找不到变量x,继续去局部外的局部——函数outer()中找,这时找到了,最后输出1

3.全局作用域

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
x = int(3.3)
x = 0
def outer():
    o = 1
    def inner():
        i = 2
        print(x)
    inner()

outer()

程序输出结果为0,在局部(inner 函数)、局部的局部(outer 函数)都没找到变量x,于是访问全局变量,此时找到了并输出。

4.内建作用域

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
x = int(3.3)
g = 0
def outer():
    o = 1
    def inner():
        i = 2
        print(x)
    inner()

outer()

程序输出结果为3,在局部(inner 函数)、局部的局部(outer 函数)以及全局变量中都没有找到变量x,于是访问内建变量,此时找到了并输出。