局部變量
要談局部變量和全局變量的技術前提是對函數有一定的理解,我們先在這裏簡單說明一下Python的函數,Python有自帶的函數也可以使用第三方工具包了外部引用函數,有的時候用戶自己可以自主開發一些特定功能的函數我們稱之爲自定義函數。用戶怎麼才能自己定義函數呢?Python 規定的自定義函數語法結構如下:
def function_name(parameters): (TAB)statement1 (TAB)statement2 (TAB)statement3 (TAB)etc.
第1行是定義函數名及函數的參數,請注意函數右括號後有一個冒號!第2-5 行是函數語句塊。需要注意的是函數名下的每條語句前都要用TAB鍵縮進一下,否則會認爲是非本函數的語句塊裏的語句,而是與函數同級的程序的某條語句。Python函數體不用花括號將語句塊括起來而是用TAB來區分語句是函數裏的還是不是函數的。函數無返回值類型,行參也無數據類型說明。
自定義函數可以像C語言一樣在其他地方被其他程序或語句調用,調用自定函數時不需要使用def這個關鍵字。我們舉例說明一下。
#define function: add def add(x, y): z = x + y return z #define main function def main(): a = 12 b = 13 #function 'add' called c = add(a, b) print c #programme entry main() print 'End!'
程序代碼從第13行開始執行,從第2行到第11行分別定義了add和main兩個函數。add函數有兩個形參x 和y,而main 函數無形參也無返回值。程序從第13行開始執行然後跳轉到自定義main函數的的第7 行、8行和第10行,當程序執行到第10行的時候又跳轉到add函數的第3 行、第4行將和返回給調用函數main,當add 執行完以後返回到調用函數main函數,同時會把返回值賦值給第10行的等號左邊的c 這個變量,接下來執行第11行,打印求和結果,執行完11 行後main被全部執行完畢返回到第13行的下一行第14 行打印出字符串’End!’,至此整個程序結束。
有了函數的基本概念以後,我們再來聊聊Python變量的局部變量問題。顧名思義局部變量肯定生活在某個局部地方,那什麼叫局部變量呢?定義在函數體內的變量叫局部變量,因此我們可以很快得到全局變量的定義,那就是定義在函數體外的變量時全局變量。局部變量只可被本函數使用,全局變量可以被所有語句訪問使用。
def f1(): x = 12 print x def f2(): y = 13 print y def f3(): print x print y def main(): f1() f2() %f3() main()print 'End!'
此時第13行代碼是被註釋掉的,如果打開第13行會報錯如下:
>>>1213Traceback (most recent call last): File "F:/Python27/t2.py", line 14, in <module> main() File "F:/Python27/t2.py", line 13, in main f3() File "F:/Python27/t2.py", line 8, in f3 print xNameError: global name 'x' is not defined >>>
錯誤是說main函數在調用函數f3時發現f3函數某一行有問題(的第8行)“print x” 裏的x 沒有定義。我猜設計者是想打印f1定義的x 想打印出12,對麼?但x定義在自定義函數f1 裏,x此時是局部變量不能被除f1 函數之外的函數或者語句使用,故報錯。由於局部變量定義在函數體裏,故多個函數可以在各自函數體內使用相同的變量名作爲自己的變量。
全局變量
全局變量沒有定義在任何函數體內,或者可以這麼說和main函數屬於同一級,全局變量可以被自定義的函數訪問使用,如果函數想讀去某個全局變量沒有特別的要求,直接使用即可。但是如果某函數想在函數裏修改某個全局變量,Python語言要求在修改前用global 語句聲明一下這個變量是全局的才能修改這個全局變量。
def printLocalx(): x = 12 print 'f1 local x = ', print x def printLocaly(): y = 13 print 'f2 local y = ', print y def readGlobal(): print 'f3 read global x = ', print x print 'f3 read global y = ', print y def modifyGlobal(): global x print 'f4 write x = -1' x = -1 def main(): printLocalx() printLocaly() readGlobal() modifyGlobal() x = 200 y = 100 main() print 'after modified global x = ', print x print 'End!'
此時由於程序定義了全局變量x和y,故readGlobal函數的兩條打印語句是不會報語法錯誤的。全局變量可被任何子函數訪問使用,在readGlobal函數裏(第11行和第13行)讀x和y變量的值,沒有問題。而在modifyGlobal函數體裏(第17行)將x賦值爲-1,如果自定義函數體修改全局變量,首先要像第15行那樣聲明一下這個x是全局的變量,只有這樣才能修改全局的x變量。如果去掉第15和16行,第17 行的x將被看做modifyGlobal 函數的局部變量。
程序執行結果如下所示:
f1 local x = 12f 2 local y = 13 f3 read global x = 200 f3 read global y = 200 f4 write x = -1after f4 modified global x = -1 End!