Python 3 學習筆記之——變數作用域、模組和包
1. 變數作用域
-
Python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在哪裡賦值的。變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱。Python 的作用域一共有4種,分別是:
- L (Local) 區域性作用域
- E (Enclosing) 閉包函式外的函式中
- G (Global) 全域性作用域
- B (Built-in) 內建作用域
-
以 L –> E –> G –>B 的規則查詢,即:在區域性找不到,便會去區域性外的區域性找(例如閉包),再找不到就會去全域性找,再者去內建中找。
x = int(2.9) # 內建作用域
g_count = 0 # 全域性作用域
def outer():
o_count = 1 # 閉包函式外的函式中
def inner():
i_count = 2 # 區域性作用域
- Python 中只有模組(module)、類(class)以及函式(def、lambda)才會引入新的作用域,其它的程式碼塊(如 if/elif/else/、try/except、for/while等)是不會引入新的作用域的,也就是說這些語句內定義的變數,外部也可以訪問。
2. 全域性變數和區域性變數
- 定義在函式內部的變數擁有一個區域性作用域,定義在函式外的擁有全域性作用域。區域性變數只能在其被宣告的函式內部訪問,而全域性變數可以在整個程式範圍內訪問。呼叫函式時,所有在函式內宣告的變數名稱都將被加入到作用域中。
total = 0 # 這是一個全域性變數
def sum( arg1, arg2 ):
#返回2個引數的和."
total = arg1 + arg2 # total在這裡是區域性變數.
print ("函式內是區域性變數 : ", total)
return total
#呼叫sum函式
sum( 10, 20 )
print ("函式外是全域性變數 : ", total)
- 當內部作用域想修改外部作用域的變數時,就要用到 global 和 nonlocal 關鍵字了。
- 修改全域性變數
num = 1
def fun1():
global num # 需要使用 global 關鍵字宣告
print(num)
num = 123
print(num)
fun1()
print(num)
>>>
1
123
123
- 修改巢狀作用域中的變數
def outer():
num = 10
def inner():
nonlocal num # nonlocal關鍵字宣告
num = 100
print(num)
inner()
print(num)
outer()
>>>
100
100
3. 模組
import module_name
- 當 Python 直譯器遇到 import 語句時,會在 Python 的搜尋路徑中依次去尋找所引入的模組。
- 搜尋路徑被儲存在 sys 模組中的 path 變數,sys.path 輸出是一個列表,其中第一項是空串 ‘’,代表當前目錄,亦即我們執行 Python 直譯器的目錄(對於指令碼的話就是執行的指令碼所在的目錄)。
- 因此如果在當前目錄下存在與要引入模組同名的檔案,就會把要引入的模組遮蔽掉,這也就是我們自己的模組名不能和 Python 標準模組名重名的原因。
- 一個模組只會被匯入一次,不管你執行了多少次 import ,這樣可以防止匯入模組被一遍又一遍地執行。
from module_name import function_name
- Python 的 from 語句讓你從模組中匯入一個指定的部分到當前名稱空間中。
from module_name import *
- 把一個模組的所有內容全都匯入到當前的名稱空間。
name 屬性
- 一個模組被另一個程式第一次引入時,其主程式將執行。如果我們想在模組被引入時,模組中的某一程式塊不執行,我們可以用 name 屬性來使該程式塊僅在該模組自身執行時執行。
if __name__ == '__main__':
print('程式自身在執行')
else:
print('我來自另一模組')
- 每個模組都有一個__name__屬性,當其值是’main’時,表明該模組自身在執行,否則是被引入。
dir() 函式
- 內建的函式 dir() 可以找到模組內定義的所有名稱,以一個字串列表的形式返回。
4. 包
-
包是一種管理 Python 模組名稱空間的形式,採用"點模組名稱"。比如一個模組的名稱是 A.B, 那麼他表示一個包 A 中的子模組 B 。
-
不妨假設你想設計一套統一處理聲音檔案和資料的模組(或者稱之為一個"包")。
-
現存很多種不同的音訊檔案格式(基本上都是通過字尾名區分的,例如: .wav,:file:.aiff,:file:.au,),所以你需要有一組不斷增加的模組,用來在不同的格式之間轉換。
-
並且針對這些音訊資料,還有很多不同的操作(比如混音,新增回聲,增加均衡器功能,建立人造立體聲效果),所以你還需要一組怎麼也寫不完的模組來處理這些操作。
-
這裡給出了一種可能的包結構(在分層的檔案系統中):
-
注意當使用 from package import item 這種形式的時候,對應的 item 既可以是包裡面的子模組(子包),或者包裡面定義的其他名稱,比如函式,類或者變數。
-
import 語法會首先把 item 當作一個包定義的名稱,如果沒找到,再試圖按照一個模組去匯入。如果還沒找到,恭喜,一個:exc:ImportError 異常被丟擲了。
-
反之,如果使用形如 import item.subitem.subsubitem 這種匯入形式,除了最後一項,都必須是包,而最後一項則可以是模組或者是包,但是不可以是類,函式或者變數的名字。
-
from package import * 匯入語句遵循如下規則:如果包定義檔案 init.py 存在一個叫做 all 的列表變數,那麼在使用 from package import * 的時候就把這個列表中的所有名字作為包內容匯入。
-
如果 all 真的沒有定義,那麼使用 from sound.effects import * 這種語法的時候,就不會匯入包 sound.effects 裡的任何子模組。他只是把包 sound.effects 和它裡面定義的所有內容匯入進來(可能執行__init__.py裡定義的初始化程式碼)。
參考資料 菜鳥教程
獲取更多精彩,請關注「seniusen」!
相關文章
- Python課堂筆記 第7章 包、模組、函式與變數作用域Python筆記函式變數
- 未知領域系列:Python基礎之迴圈,條件,包,函式,模組和變數作用域Python函式變數
- Python學習筆記 - 作用域Python筆記
- python學習筆記 區域性和全域性作用域Python筆記
- 你不懂的JS學習筆記(作用域和閉包)JS筆記
- Python零基礎學習筆記(二十六)——變數的作用域Python筆記變數
- Python學習之模組與包Python
- Python3學習筆記3,變數、運算子Python筆記變數
- Python3學習筆記4 , 迴圈、模組Python筆記
- Python學習筆記 - 變數Python筆記變數
- 一起學習JavaScript (4) 之變數、作用域和記憶體問題JavaScript變數記憶體
- Python 函式和變數作用域Python函式變數
- Python學習筆記|Python之內建變數__name__Python筆記變數
- python學習筆記:第10天 函式進階和作用域Python筆記函式
- python變數與變數作用域Python變數
- Solidity語言學習筆記————25、作用域和宣告Solid筆記
- Python 3 學習筆記之——錯誤和異常Python筆記
- Python學習之模組Python
- Python學習筆記_函式_匯入模組Python筆記函式
- Python 學習筆記-2-1-變數Python筆記變數
- 【譯】終極指南:變數提升、作用域和閉包變數
- C語言學習筆記之變數C語言筆記變數
- 新版紅寶書第四章變數、作用域與記憶體(學習筆記)變數記憶體筆記
- python3學習筆記之 強引用和弱引用Python筆記
- Python學習之變數、物件和引用Python變數物件
- Python學習筆記 - 閉包Python筆記
- JavaScript之變數及作用域JavaScript變數
- rust學習八、包和模組Rust
- Python學習之常用模組Python
- Python學習之 datetime模組Python
- Python筆記之paramiko模組安裝和使用示例Python筆記
- 深入學習js之——詞法作用域和動態作用域JS
- Python 3 學習筆記之——物件導向Python筆記物件
- JDK 新特性學習筆記之模組系統JDK筆記
- JS 底蘊之 變數、作用域和垃圾回收JS變數
- javascript:變數、作用域和記憶體問題JavaScript變數記憶體
- Python學習筆記 9.0 模組 與 包 與 物件導向版學員管理系統Python筆記物件
- JavaScript中變數和作用域JavaScript變數