测试题:
0. 如果希望在函数中修改全局变量的值,应该使用什么关键字?
global 关键字
>>> count = 5
>>> def MyFun():
global count
count = 10
print(count)
>>> MyFun()
10
>>> count
10
1. 在嵌套的函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字?
nonlocal 关键字
>>> def Fun1():
x = 5
def Fun2():
nonlocal x
x *= x
return x
return Fun2()
>>> Fun1()
25
2. Python 的函数可以嵌套,但要注意访问的作用域问题哦,请问以下代码存在什么问题呢?
def outside():
print('I am outside!')
def inside():
print('I am inside!')
inside()
正确的调用应该是:
def outside():
print('I am outside!')
def inside():
print('I am inside!')
inside()
outside()
使用嵌套函数要注意一点就是作用域问题,inside() 函数是内嵌在 outside() 函数中的,所以 inside() 是人妻,除了身为老公的 outside() 可以碰(调用),在外边或者别的函数体里是无法对其进行调用的。
3. 请问为什么代码 A 没有报错,但代码 B 却报错了?应该如何修改?
代码A:
def outside():
var = 5
def inside():
var = 3
print(var)
inside()
outside()
答:3
代码B:
def outside():
var = 5
def inside():
print(var)
var = 3
inside()
outside()
答:报错
仔细一看报错的内容是:UnboundLocalError: local variable ‘var’ referenced before assignment,说的是变量 var 没有被定义就拿来使用,肯定错啦!
这里 outside() 函数里有一个 var 变量,但要注意的是,内嵌函数 inside() 也有一个同名的变量,Python 为了保护变量的作用域,故将 outside() 的 var 变量屏蔽起来,因此此时是无法访问到外层的 var 变量的。
- 请问如何访问 funIn() 呢?
def funOut():
def funIn():
print('宾果!你成功访问到我啦!')
return funIn()
答:funOut()
5. 请问如何访问 funIn() 呢?
def funOut():
def funIn():
print('宾果!你成功访问到我啦!')
return funIn
答:funOut()()
- 以下是“闭包”的一个例子,请你目测下会打印什么内容?
def funX():
x = 5
def funY():
nonlocal x
x += 1
return x
return funY
a = funX()
print(a())
print(a())
print(a())
答:
6
7
8
当 a = funX() 的时候,只要 a 变量没有被重新赋值,funX() 就没有被释放,也就是说局部变量 x 就没有被重新初始化。