1.全域變數與局部變數
這兩個變數與其它語言中的變數一樣,全域變數簡言之就是在整個程式碼中都可以使用的變量,它的作用域是整個函數,而局部變數的作用域有限,往往就是在一塊程式碼區域。
需要值得注意的是:如果只是在函數中調用全域變數的值而不改變其值,那是完全沒有問題的,但是如果要在函數中改變全域變數的值而不進行特殊處理的話,Python語言對於這種情況的處理是會在自動產生一個與被呼叫的全域變數名稱一樣的局部變量,也就是屏蔽了全域變量,而對該變數的操作不會影響全域變數的值。 (雖然看著好像是改變了一樣)
例如下面程序,雖然在函數中改變了count的值,但是在函數體外打印的count的值仍是5.
count=5def Myfun(): count=10 print(count) Myfun() print(count)
如果說非要在函數內部修改全域變數的值的話,可以在函數內部使用關鍵字global來修飾該變量,這樣就是表示該操作是對於全域變數的操作,而不是產生一個與全域變數相同的局部變數。
print("======使用global之后的变量======") count=5def Myfun(): global count#声明与赋值不能一块进行 count=10 print(count) Myfun() print(count)
2.內嵌(內部)函數
簡言之,內嵌函數就是在函數內部定義的函數
值得注意的是:內部函數的調用只能在其外部的函數調用,而在之外無法調用。也就是說,在誰的內部,誰才有權利使用。
print("======内部函数的使用======")def fun1(): print("fun1()正在被调用") def fun2(): print("fun2()正在被调用") fun2() fun1()
3.閉包
閉包就是內嵌函數呼叫其外部函數的參數。
這種函數在呼叫的時候需要格外注意。
def funX(x): def funY(y): return x*y return funY print(funX(5)(8))
4.閉包中的變數問題
下面這段程式碼執行起來就會報錯。因為在內嵌函數的內部呼叫外部函數的參數,而參數x對於Fun2()這個函數來說是一個全域變量,由於屏蔽作用,造成函數出錯。
def Fun1(): x=5 def Fun2(): x*=x return x return Fun2()#Fun1()
解決上述問題的方法有兩個:
一是使用非堆疊的資料結構來解決問題
二是使用nonlocal關鍵字來解決
#一种解决办法就是使用非栈存储,使用序列等来存储def Fun1(): x=[5] def Fun2(): x[0]*=x[0] return x[0] return Fun2() print(Fun1(),"\n")#在一种解决办法就是使用nonlocal关键字def Fun3(): x=5 def Fun4(): nonlocal x x*=x return x return Fun4() print(Fun3())
rrreee
二是使用nonlocal關鍵字來解決rrreee