變量的作用域
變量的作用域就是指變量的有效范圍。
變量按照作用范圍分為兩類,分別是 全局變量 和 局部變量。
全局變量:在函數外部聲明的變量就是全局變量
有效范圍:
全局變量在函數外部可以正常使用。
全局變量在函數內部也可以正常使用(需要用global聲明)
局部變量:在函數內部聲明的變量就是局部變量
有效范圍:
局部變量在函數內部可以正常使用
局部變量在函數外部不可以訪問
global關鍵字
global的作用就是把局部變量提升為全局變量
格式:
def 函數名(): global 變量名 函數功能代碼..
示例:
def funName(): global name #如果不使用global關鍵字,外部是無法訪問變量name的。 name = 'dragon' funName() #調用 print(name) #嘗試訪問內部函數 '''注釋: global只有在函數內部對變量進行全局聲明,該變量才是一個完整的全局變量(在函數外部可以對該變量進行任意操作)。 '''
內部函數
在函數內部聲明的函數就是內部函數。
格式:
def 函數名(): 局部變量... def 內部函數名(): Python功能代碼...
示例:
def funName(): name = 'dragon' #定義一個內部函數 def inner(): print('我是內部函數') '''注釋: 1.內部函數的本質就是局部變量(函數就是一個變量) 2.內部函數在函數外部不可以直接調用 3.內部函數在函數內部調用(當然,必須要定義內部函數之后才能調用) '''
閉包
使用特定或特殊的方式,將局部變量(內部函數)引入到全局環境中使用,這就是閉包操作。
閉包方法1:
def 函數名(): 局部變量... def 內部函數名(): pass return (局部變量,內部函數...)
閉包方法2:
def 函數名(): 局部變量 def 內部函數名(): pass #獲取所有需要進行閉包操作的函數和變量 defall(): return(局部變量,內部函數...) return all
閉包的優缺點:
優點:
1.可以方便的進行函數式編程,組織程序代碼
2.使內部函數和局部變量在外部可以訪問
缺點:
1.閉包操作會導致整個函數的內部環境,被長久保存,占用大量內存。
閉包環境查看:__closure__
用於查詢當前閉包操作所使用的環境中的變量和內部函數等信息。
nonlocal
nonlocal關鍵字的意義,不是局部變量,當然他也不是全局變量,通常用於內部函數中使用外部函數的局部變量。
#聲明一個外部函數 def outer(): #聲明一個變量(肯定不是全局變量) x = 5 #聲明一個內部函數 def inner(): nonlocal x #聲明x不是局部變量 x += 9 print(x) #調用函數 inner() #調用outer outer() '''注釋: 如果內部函數想使用全局變量,那么應該使用global聲明變量 (函數最外層的全局變量) 如果內部函數使用的是外部函數的局部變量,那么應該使用nonlocal聲明 (內部函數的外層,外部函數的局部變量) '''