動態強類型:
- 動態類型語言:在運行期進行類型檢查的語言,也就是在編寫代碼的時候可以不指定變量的數據類型,比如Python和Ruby
- 靜態類型語言:它的數據類型是在編譯期進行檢查的,也就是說變量在使用前要聲明變量的數據類型,這樣的好處是把類型檢查放在編譯期,提前檢查可能出現的類型錯誤,典型代表C/C++和Java
- 強類型語言,一個變量不經過強制轉換,它永遠是這個數據類型,不允許隱式的類型轉換。舉個例子:如果你定義了一個double類型變量a,不經過強制類型轉換那么程序int b = a無法通過編譯。典型代表是Java。
- 弱類型語言:它與強類型語言定義相反,允許編譯器進行隱式的類型轉換,典型代表C/C++。
Python四種namespace:
通俗的來說,Python中所謂的命名空間可以理解為一個容器。在這個容器中可以裝許多標識符。不同容器中的同名的標識符是不會相互沖突的。理解python的命名空間需要掌握三條規則:
- 第一,賦值(包括顯式賦值和隱式賦值)產生標識符,賦值的地點決定標識符所處的命名空間。
- 第二,函數定義(包括def和lambda)產生新的命名空間。
- 第三,python搜索一個標識符的順序是"LEGB"。
所謂的"LEGB"是python中四層命名空間的英文名字首字母的縮寫。
- 最里面的一層是L(local),表示在一個函數定義中,而且在這個函數里面沒有再包含函數的定義。
- 第二層E(enclosing function),表示在一個函數定義中,但這個函數里面還包含有函數的定義,其實L層和E層只是相對的。
- 第三層G(global),是指一個模塊的命名空間,也就是說在一個.py文件中定義的標識符,但不在一個函數中。
- 第四層B(builtin),是指python解釋器啟動時就已經具有的命名空間,之所以叫builtin是因為在python解釋器啟動時會自動載入__builtin__模塊,這個模塊中的list、str等內置函數的就處於B層的命名空間中。