测试题:
0.如果希望在函数中修改全局变量的值,应该使用什么关键字?
global关键字
1 count = 5 2 def Myfun(): 3 global count 4 count =10 5 print(count) 6 Myfun() 7 print(count)
1.在嵌套函数中,如果希望在内部函数修改外部函数的局部变量,应该是用什么关键字?
nonlocal关键字
1 def Fun1(): 2 x = 5 3 def Fun2(): 4 nonlocal x 5 x *=x 6 return x 7 return Fun2() 8 print(Fun1())
2.Python的函数可以嵌套,但是要注意访问的作用域问题,请问以下代码存在什么问题呢?
1 def outside(): 2 print("I am outside!") 3 def inside(): 4 print("I am inside!") 5 inside()
使用嵌套函数要注意一点就是作用域的问题,Inside()函数是内嵌在outside()函数中的,所以inside()只能outside()可以调用,在外边或者别的函数体里是无法对其进行调用的。
1 def outside(): 2 print("I am outside!") 3 def inside(): 4 print("I am inside!") 5 inside() 6 outside()
3.请问为什么代码A没有报错,但是代码B却报错了?应该如何修改?
代码A:
1 def outside(): 2 var = 5 3 def inside(): 4 var = 3 5 print(var ) 6 inside() 7 outside()
代码B:
1 def outside(): 2 var = 5 3 def inside(): 4 print(var ) 5 var = 3 6 inside() 7 outside()
代码B中的outside()函数里有一个var变量,但是要注意的是,内嵌函数inside()也有一个同名的变量,Python为了保护变量的作用于,故将outside()的var变量屏蔽起来,因此此时是无法访问到外层的var变量。
1 def outside(): 2 var = 5 3 def inside(): 4 nonlocal var 5 print(var ) 6 var = 3 7 inside() 8 outside()
4.请问如何访问FunIn()呢?
1 def funOut(): 2 def funIn(): 3 print("宾果!恭喜成功访问到啦~") 4 return funIn()
运行funOut()
5.请问如何访问FunIn()呢?
1 def funOut(): 2 def funIn(): 3 print("宾果!恭喜成功访问到啦~") 4 return funIn
方法一:调用funout()()
方法二:g = funout()
运行g()
6.以下是“闭包”的一个例子,请你目测下会打印什么内容?
1 def funX(): 2 x=5 3 def funY(): 4 nonlocal x 5 x+=1 6 return x 7 return funY 8 a=funX() 9 print(a()) 10 print(a()) 11 print(a())
输出结果:
6
7
8
有些鱼油可能会比较疑惑,这……怎么跟全局变量一样了?局部变量x不是应该在每次调用的时候都重新初始化了吗?!
其实大家仔细看看就明白了,当a = funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x就没有被重新初始化。
所以当全局变量不适用的时候,可以考虑使用闭包更稳定和安全,你还可以参考 -> 游戏中的角色移动:闭包在实际开发中的作用