1 namespace

在python中。只有模块(module)才会重新开辟一个新的作用域,像if/else,for loop,while loop等是不会开辟新的作用域的。也就是说,在上述这几个循环体或控制体中的变量,在外部也就是主作用域中一样可以调用。看下面代码:

1
2
3
for i in range(10):
s = i
print(s)

运行结果:9

从代码中可以看出,这几个控制体中不存在作用域。

2 global

上一节讲述了作用域,这里就介绍一下global关键字。先看代码:

1
2
3
4
5
6
7
num = 100
def test():
num = 10
num = num * 2
print(num)

test()

运行结果: 20

如果想要在test()函数内部调用外部的num变量,那么就需要使用global关键字。如下:

1
2
3
4
5
num = 100
def test():
global num
num = num * 2
print(num)

运行结果:200

3 nonlocal

在介绍nonlocal关键字之前,大家需要先了解一下闭包的概念,闭包在很多的编程语言中都有,在python中也有。

什么是闭包?

闭包就是在一个函数嵌套另一个函数,这两个函数都有其局部变量,外部的函数中的变量,在内部函数中是不能被直接修改的。也就是说,我们可以进行间接修改。那间接修改就需要用到nonlocal关键字。

先看一段代码:

1
2
3
4
5
6
7
8
9
def outter():
var = 200 # this is a nonlocal variable
def inner():
# nonlocal var # define a nonlocal variable
var = 300 # this variable is different from the outter.var
print("inner:", var)
inner()
print("outter:", var)
outter()

运行结果:
inner:300
outter:200

这是没有使用nonlocal关键字的代码:如果我们使用nonlocal定义var的话,那么救结果就不同了:

修改代码:去掉第4行的注释即可
运行结果:
inner:300
outter:300

写在最后

欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。
微信公众号