2.2. 變數與基本型別¶
變數 是你用 = 運算子綁定到某個值的名稱。指派之後,這個名稱可以用在任何能用該值的地方:
width = 320
height = 240
pixels = width * height
print(pixels) # prints 76800
= 的右側會先被求值,然後將結果綁定到左側的名稱。讀取一個從未被指派過的名稱會引發 NameError。
變數只是一個標籤。它指向一個值 -- 值存在於別處,而同一個值可以有任意數量的標籤。
變數是指向值的標籤。重新指派變數會移動標籤;它不會改變該標籤原本所指向的值。¶
2.2.1. 命名規則¶
2.2.2. 基本型別¶
Python 中的每個值都有一個 型別,決定它支援哪些運算。你最常會寫到的四種型別是:
int -- 整數,正數或負數皆可。MicroPython 的整數可以大到記憶體所能容納的程度。字面值寫成單純的數字:
0、42、-7。十六進位(0x1A)、八進位(0o17)與二進位(0b1010)字面值也都有效,對暫存器與位元遮罩很有用。float -- 帶有小數點或指數的數字:
3.14、1.0、-0.5、2e6(= 2,000,000.0)。相機上的所有浮點數都是 IEEE 754 32 位元 -- 精確到約七位有效數字。bool -- 兩個字面值
True或False其中之一(注意大小寫)。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 這樣的方法會改變綁定所指向的值,因此指向同一個值的所有其他名稱都會看到這個變化。