python 範圍,python
在寫範圍前,先來瞭解下局部變數和全域變數。理解局部變數和全域變數後,範圍的概念就很好理解了。
局部變數:局部變數只能在局部訪問到,當超過其範圍時,變失去作用。
全域變數:無論在任何範圍都可以使用。當前範圍有相同變數名的局部變數時,局部變數生效。
(忘記準確定義了,忘掉他吧)
1、Python中無
塊集範圍 Java/C#有塊集範圍 Python/JavaScript無塊集範圍 所謂塊集範圍,需要先瞭解Python的代碼塊概念。Python遵從嚴格的縮排標準,可以認為處在同一縮排之間的代碼即為一個代碼塊。如if判斷,for,while迴圈等。
if 1==1: #if,for 等構成一個代碼塊 name = 'zhang'#代碼塊結束 print(name)
實際運行中,print(name)有輸出值,但是其和if位於相同的縮排位置,也就是屬於不同的代碼塊。因此,Python中沒有塊集範圍。
2、Python中以函數為範圍
先來看個例子:
def func(): #函數內定義的變數只能在函數內使用,無法再外部參考(以函數為範圍) name = 'zhang'print(name)>>>Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/s13/day10/範圍.py", line 11, in <module> print(name)NameError: name 'name' is not defined
當運行上面這段代碼時,報錯了!Python文法中,函數體為單獨的範圍。就行在運行代碼時,遇到函數預設是不執行函數體裡面的代碼的,等待調用函數後才會執行。因此,函數內定義的變數只能在函數內調用。
3、Python存在範圍鏈,當前範圍找不到的話則往上找
name = 'zhang'def func(): name='a' #print(name) def f2(): name='b' print(name) f2()func()>>>b
變數name在func和f2中都有定義,執行func()的時候,先賦值name='a',然後執行f2(),重新定義name = 'b',在執行print(name)的時候,輸出的結果為‘b’
在函數未執行之前,範圍和範圍鏈以全部確定。
name ='alex'def f1(): print(name) #f1繼承自己的範圍 def f2(): name = 'eric' f1()f2() #執行f1()>>>alex
name = 'zhang'def f1(): print(name)def f2(): name = 'eric' #print(name) return f1ret = f2()ret()>>>zhang
到這裡,Python的範圍基本算整理完了,在編寫Python檔案的過程中,需要注意變數的範圍,以免使用變數的時候引用錯誤或者找不到變數。
最後來個燒腦的,分析下最後的執行結果:
li = [lambda :x for x in range(10)]r = li[0]()print(r)>>>9
#li為列表
#li內的元素為:lambda運算式,函數
#函數在未調用前,內部代碼不執行
#li[0]的輸出結果為一個個函數體的記憶體位址,即li[0]為函數
#li[0]()執行函數
#先執行for迴圈,迴圈的結果為9,然後把9賦值給x
#因為for迴圈執行10次,所有li的長度為10,裡面的每個元素都為9。(x相對於for迴圈來說位於迴圈之外,因此x獲得的是for迴圈的執行結果,而不是0-9的值)
最後推薦下武sir的《五句話搞定JavaScript範圍》