1、global关键字
全局变量的作用域是整个模块(也就是整个代码段),也就是代码段内的所有函数内部都可以访问到全局变量。但注意,在函数内部仅仅去访问全局变量就好,不要试图去修改它。
因为那样的话,Python会使用屏蔽(shadowing)的方式“保护”全局变量:一旦函数内部试图修改全局变量,Python就会在函数内部自动创建一个名字一模一样的局部变量,这样子修改的结果只会修改到局部变量,而不会影响到全局变量。
>>> count = 5
>>> def MyFun():
count = 10
print(count)
>>> MyFun()
10
>>> print(count)
5
>>>
如果要在函数中修改全局变量,使用关键字global
>>> def MyFun():
global count
count = 10
print(count)
>>> MyFun()
10
>>> print(count)
10
>>>
2、内嵌函数
Python的函数定义可以嵌套的,也就是允许在函数内部创建另一个函数,这样的函数叫做内嵌函数或者内部函数。
>>> def fun1():
print('fun1正在被调用...')
def fun2():
print('fun2正在被调用...')
fun2()
>>> fun1()
fun1正在被调用...
fun2正在被调用...
>>>
3、闭包
闭包(closure)是函数式编程的一个重要语法结构,函数式编程是一种编程范式,著名的函数编程语言就是LISP语言(主要用于绘图,AI)
不同的编程语言实现闭包的方式不同,Python中闭包从表现上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
>>> def FunX(x):
def FunY(y):
return x*y
return FunY
>>> i = FunX(8)
>>> i
<function FunX.<locals>.FunY at 0x024EE390>
>>> type(i)
<class 'function'>
>>> i(5)
40
>>> FunX(8)(5)
40
>>>
内部函数FunY()就是闭包。
在外部调用FunY()是不允许的:
>>> FunY(5)
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
FunY(5)
NameError: name 'FunY' is not defined
>>>
>>> def Fun1():
x = 5
def Fun2():
x*=x
return x
return Fun2()
>>> Fun1()
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
Fun1()
File "<pyshell#41>", line 6, in Fun1
return Fun2()
File "<pyshell#41>", line 4, in Fun2
x*=x
UnboundLocalError: local variable 'x' referenced before assignment
可以进行如下改造,x变为一个列表,因为列表不是存在栈里面
>>> def Fun1():
x = [5]
def Fun2():
x[0]*=x[0]
return x[0]
return Fun2()
>>> Fun1()
25
(1)、关键字 nonlocal
还可以使用关键字nonlocal,把x强制声明为非局部变量。
>>> def Fun1():
x = 5
def Fun2():
nonlocal x
x*=x
return x
return Fun2()
>>> Fun1()
25