JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

變數與型別:裝資料的盒子

變數是一個有名字的盒子,用來裝一個值;而這個值的型別悄悄決定了你能拿它來做什麼。

核心想法:一個有名字的盒子

想像你在做飯,舀了一些糖放進一個小罐子,然後在上面貼了張標籤,寫著「糖」。從此你不再去想那一堆具體的晶體——你只說「糖」,伸手就拿那個罐子。變數(variable)正是這個罐子:一個有名字的盒子,你把一個值存進去,之後就能用名字去取它,而不必記住那個值本身。

為什麼要這麼做?因為程式要同時擺弄許多值——玩家的分數、某人的名字、一杯咖啡的價格——而這些值在程式執行時會不斷變化。變數給每個值一個可以抓住的「把手」。你寫一次名字,程式就會悄悄取出盒子裡此刻裝著的東西。

給盒子取名,往裡放東西

建立一個變數分兩步:取一個名字,再放一個值進去。在大多數語言裡,等號 = 負責「放進去」這部分。別把它讀成「等於」,而要讀成一個箭頭:「把這個值,存進這個盒子裡」。名字寫在左邊,值寫在右邊。

score = 0
name = "Mira"

score = score + 10   # the box now holds 10
先填好兩個盒子,然後修改 score:讀出它目前的值(0),加 10,再把 10 存回去。

最後那行常讓新手吃驚,所以仔細看。右邊先執行:score 目前是 0,加 10 得 10。然後這個 10 被存回 score 盒子裡,替換掉舊的值。盒子沒有變多——它只是換了裡面裝的東西。

型別:盒子裡裝的是哪種東西

你存進去的每個值都有一個型別(type)——它的「種類」。你最先會遇到的四種是:文字(一串字元,比如名字,稱為字串)、數字(用來計數和算術)、真/假(一個是非答案,稱為布林值),以及清單(幾個值按順序排成一排)。型別不只是個標籤;它決定了你能拿這個值來做什麼。

title = "Hello"      # text
price = 4.5          # number
inStock = true       # true/false
colors = ["red", "blue"]   # a list
四種常見型別。注意文字戴著引號,數字不戴,清單則裝在方括號裡。

這就是型別重要的原因。你可以把兩個數字相乘(價格乘以數量),但把兩個名字相乘毫無意義。你可以問一個清單「你裝了多少項?」,但這個問題對一個單獨的數字毫無意義。型別悄悄地為每個值定下了「合理操作」的選單。

陷阱:"2" 不是 2

現在來看幾乎每個新手都會踩的經典坑。看看 2 和 "2"。在你眼裡它們一模一樣。但對電腦來說它們是不同的型別:2 是數字,而 "2"——戴著引號——是一段恰好長得像數字的文字。而加號 + 會因型別不同而做不同的事。

2 + 2       // number + number  -> 4
"2" + "2"   // text + text      -> "22"
同一個符號,兩種含義:對數字,+ 是相加;對文字,+ 是把它們首尾黏在一起。

對數字,+ 是相加:2 + 2 是 4,正如你所願。對文字,+ 是把字串首尾黏起來,所以 "2" + "2" 變成 "22"——兩個字元並排貼在一起。什麼都沒壞;電腦對每種型別都精確地執行了 + 的含義。意外只是因為引號太容易被忽略。

當一個值在你沒察覺時偷偷以文字形式溜進來時,這個坑咬得最狠——比如,從網頁表單裡輸入的數字,通常是以文字形式到達的。所以如果你的計算結果本該是 15,卻得到 "510",別慌:先檢查型別。罪魁禍首通常就是一個戴著引號的數字,把它轉換回真正的數字就能解決。

小結

變數是一個裝值的、有名字的盒子。你用 = 把它填滿(「把右邊這個存進左邊的盒子」),用名字讀取它,想覆寫隨時覆寫。這一個想法,是你將來寫的幾乎每個程式的骨架。

每個值還有一個型別——文字、數字、真/假,或清單——型別決定了拿它來做什麼才說得通。要記住的那個坑:"2"(文字)和 2(數字)看起來像,行為卻不同,所以當算術讓你意外時,先檢查型別,再說別的。掌握這兩個想法,程式設計的其餘部分就有了一塊結實的立足之地。