變數
變數是什麼?為什麼要使用變數?
想像一下,在教室裡面有 50 個學生,如果你想點名某位同學來問答問題,你會怎麼做?是「那位紅色外套長頭髮的同學」還是「第 3 排的第 2 位同學」?如果每位同學的桌上都有名牌或座號,應該就能更精準的點到指定的同學。
電腦程式也是類似的概念,在電腦的世界裡有很多的資料或數值,如果能適當的給這些資料一個標籤或名字,在取用的時候會方便的多,變數(Variable)大概就差不多這個意思。
在 Python 裡要使用變數的話,可以這樣寫:
a = 1450
b = "hello"
上面這兩行的意思就是有個名為 a
的變數,它的值是「數字」 1450
,另外有個名為 b
的變數,它的值是 "hello"
這幾個「文字」。幫資料或數值指定一個名稱或標籤,這個行為稱為「宣告(Declaration)」。有些程式語言在宣告變數的時候要在前面加個 let
或 var
,或是指定這個變數的型別,但在 Python 可以不用做這件事,就像這樣直接就能使用,不需要特別指定它是數字或文字型態(其實要也行,在本章後半段會再另外介紹)。
在後面的章節還會介紹更多除了數字跟文字之外的資料型態,不過變數就只是個名牌、標籤或是指標的概念而已,變數本身是沒有型別的。除了一次命名一個變數外,你也可以一次處理好幾個:
x, y, z = 1, 2, 3
這樣一口氣就可以產生 3 個變數 x
、y
、z
,分別指向數字 1
、2
以及 3
。
Python 的變數多重指定寫法,背後的原理其實是 Tuple(元組)資料型態,所以上面的寫法也可以寫成:
x, y, z = (1, 2, 3)
然後再利用 Tuple 的「開箱(Unpacking)」功能來把 Tuple 的值分別指定給 x
、y
、z
這三個變數,在後續介紹到 Tuple 你就會知道這是怎麼一回事了。
是說,如果想要用這種方式指定變數,但只想要有 x
跟 z
變數卻不想要有 y
變數的話,可以使用 _
來跳掉它:
x, _, z = 1, 2, 3
這個 _
在 Python 又稱之匿名變數(Anonymous Variable)或虛擬變數(Dummy Variable),通常用來表示這個變數「I don't care」的意思。不要誤會,底線 _
在 Python 是個合法的變數名稱,所以如果你要拿它來用是沒問題的:
x, _, z = 1, 2, 3
print(_) # 印出 2
通常對這種我們不在乎或懶得想名字的變數,會給它一個底線 _
來表示。如果用在 Python 的 REPL 的話,_
還能用來代表「上一次的結果」:
>>> 1 + 2
3
>>> _ + 123
126
好啦,現在我們有了變數之後,後續就可以透過變數來取用這些值:
print(a) # 印出 1450
print(b) # 印出 hello
雖然一開始變數 a
是數字 1450
,但如果要改變的話,就直接這樣寫:
a = "world" # 把原本變數 a 變成 "world"
print(a) # 印出 world
直接改就行了,就算從數字改成文字也行。
雖然 在 Python 宣告變數不需要什麼特別的語法,但變數需要先宣告才能用,如果突然莫名其妙的使用一個不存在的 girl_friend
變數,像這樣:
print(girl_friend)
執行的時候就會發生錯誤了:
$ python hello.py
Traceback (most recent call last):
File "/demo/hello.py", line 1, in <module>
print(girl_friend)
^^^^^^^^^^^
NameError: name 'girl_friend' is not defined
哇!出現了好多沒看過的東西...別擔心,仔細看的話應該會發現錯誤訊息還算清楚,它跟你在 hello.py
這個檔案的第 1 行,這個 girl_friend
變數還沒有定義,醒醒吧,它是不存在的,所以才會出現 NameError
這個錯誤訊息。
常數(Constant)
有些程式語言有「常數」的設計,常數的目的是希望這個變數的值一經宣告之後就不要再修改,但是在 Python 並沒有常數的設計,如果在 Python 裡如果想要做出類似常數的效果的話,慣例上可以在宣告變數的時候用全大寫的方式來命名,例如:
PI = 3.14159
GRAVITY = 9.8
BOOK_TITLE = "為你自己學 Python"
但這個只是個「慣例」,要改隨時都能改,全大寫只是看起來比較顯眼,目的是希望其他人如果要改動到它的時候多看兩眼。