所謂作用域(Scope),就是變量的有效范圍,就是變量可以在哪個范圍以內使用。有些變量可以在整段代碼的任意位置使用,有些變量只能在函數內部使用,有些變量只能在 for 循環內部使用。
變量的作用域由變量的定義位置決定,在不同位置定義的變量,它的作用域是不一樣的。本節我們只講解兩種變量,局部變量和全局變量。
在函數內部定義的變量,它的作用域也僅限於函數內部,出了函數就不能使用了,我們將這樣的變量稱為局部變量(Local Variable)。
要知道,當函數被執行時,Python 會為其分配一塊臨時的存儲空間,所有在函數內部定義的變量,都會存儲在這塊空間中。而在函數執行完畢後,這塊臨時存儲空間隨即會被釋放並回收,該空間中存儲的變量自然也就無法再被使用。
如果試圖在函數外部訪問其內部定義的變量,Python 解釋器會報 NameError 錯誤,並提示我們沒有定義要訪問的變量,這也證實了當函數執行完畢後,其內部定義的變量會被銷毀並回收。
值得一提的是,函數的參數也屬於局部變量,只能在函數內部使用。
除了在函數內部定義變量,Python 還允許在所有函數的外部定義變量,這樣的變量稱為全局變量(Global Variable)。
和局部變量不同,全局變量的默認作用域是整個程序,即全局變量既可以在各個函數的外部使用,也可以在各函數內部使用。
在一些特定場景中,我們可能需要獲取某個作用域內(全局范圍內或者局部范圍內)所有的變量,Python 提供了以下 3 種方式:
1) globals()函數
globals() 函數為 Python 的內置函數,它可以返回一個包含全局范圍內所有變量的字典,該字典中的每個鍵值對,鍵為變量名,值為該變量的值。
注意,globals() 函數返回的字典中,會默認包含有很多變量,這些都是 Python 主程序內置的,讀者暫時不用理會它們。
2) locals()函數
locals() 函數也是 Python 內置函數之一,通過調用該函數,我們可以得到一個包含當前作用域內所有變量的字典。這裡所謂的“當前作用域”指的是,在函數內部調用 locals() 函數,會獲得包含所有局部變量的字典;而在全局范文內調用 locals() 函數,其功能和 globals() 函數相同。
當使用 locals() 函數獲取所有全局變量時,和 globals() 函數一樣,其返回的字典中會默認包含有很多變量,這些都是 Python 主程序內置的。
注意,當使用 locals() 函數獲得所有局部變量組成的字典時,可以向 globals() 函數那樣,通過指定鍵訪問對應的變量值,但無法對變量值做修改。
顯然,locals() 返回的局部變量組成的字典,可以用來訪問變量,但無法修改變量的值。
3) vars(object)
vars() 函數也是 Python 內置函數,其功能是返回一個指定 object 對象范圍內所有變量組成的字典。如果不傳入object 參數,vars() 和 locals() 的作用完全相同。