測試題:
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就沒有被重新初始化。
所以當全局變量不適用的時候,可以考慮使用閉包更穩定和安全,你還可以參考 -> 游戲中的角色移動:閉包在實際開發中的作用
