2.2. 變數與基本型別

變數 是你用 = 運算子綁定到某個值的名稱。指派之後,這個名稱可以用在任何能用該值的地方:

width = 320
height = 240
pixels = width * height
print(pixels)               # prints 76800

= 的右側會先被求值,然後將結果綁定到左側的名稱。讀取一個從未被指派過的名稱會引發 NameError

變數只是一個標籤。它指向一個值 -- 值存在於別處,而同一個值可以有任意數量的標籤。

三個標籤分別指向三個裝箱的值;重新指派一個標籤會 移動箭頭,而非移動值。

變數是指向值的標籤。重新指派變數會移動標籤;它不會改變該標籤原本所指向的值。

2.2.1. 命名規則

  • 名稱以字母或底線開頭,可包含字母、數字與底線。frame_count_internal 都沒問題;1st_frame 則是語法錯誤。

  • 名稱區分大小寫:Widthwidth 是兩個不同的變數。

  • 避免重複使用內建名稱,例如 liststrid()print() -- 遮蔽它們不會引發錯誤,但原本的內建函式在指令碼接下來的部分就無法存取了。

  • 慣例:變數與函式使用 snake_case,不打算更改的常數使用 ALL_CAPS,類別名稱使用 CamelCase

2.2.2. 基本型別

Python 中的每個值都有一個 型別,決定它支援哪些運算。你最常會寫到的四種型別是:

  • int -- 整數,正數或負數皆可。MicroPython 的整數可以大到記憶體所能容納的程度。字面值寫成單純的數字:042-7。十六進位(0x1A)、八進位(0o17)與二進位(0b1010)字面值也都有效,對暫存器與位元遮罩很有用。

  • float -- 帶有小數點或指數的數字:3.141.0-0.52e6(= 2,000,000.0)。相機上的所有浮點數都是 IEEE 754 32 位元 -- 精確到約七位有效數字。

  • bool -- 兩個字面值 TrueFalse 其中之一(注意大小寫)。

  • str -- 文字,寫成位於單引號或雙引號之間的字元:"hello"'OpenMV'。兩種引號樣式是等價的;挑選能讓你避免轉義字串中出現的引號字元的那一種。

還有一個值得立刻認識的第五種值:

  • None -- NoneType 型別的唯一值。用來表示「沒有值」或「尚未設定」。沒有明確回傳任何東西的函式會隱含地回傳 None

2.2.3. 檢查與轉換型別

內建的 type() 函式會回傳任何值的型別:

>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>

每個型別同時也兼作轉換函式。傳給它一個不同型別的值,你就會得到對應於新型別的等價值 -- 前提是該轉換有明確定義:

>>> int("42")
42
>>> int(3.9)
3                           # truncates toward zero, not rounds
>>> float("1.5")
1.5
>>> str(255)
'255'
>>> bool(0), bool(1), bool("")
(False, True, False)

沒有明確定義的轉換會引發 ValueError

>>> int("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10

2.2.4. 重新指派與動態型別

一個名稱可以隨時重新指派為任何型別的值。以下做法是合法的:

x = 42
x = "now I'm a string"
x = 3.14

Python 不會將變數綁定到某個型別。依賴 x 為整數的程式碼,只是在使用它的那一點期望得到一個整數;如果得到的是別的東西,你就會在執行時得到 TypeError

備註

重新指派 x 不會 改變舊綁定所指向的值。如果兩個名稱共用同一個值,重新指派其中一個並不會影響另一個:

a = [1, 2, 3]
b = a                       # both point at the same list
a = "different now"
print(b)                    # still [1, 2, 3]

改動一個共用的值則是另一回事:像 list.append 這樣的方法會改變綁定所指向的值,因此指向同一個值的所有其他名稱都會看到這個變化。