核心想法:一個有名字的盒子
想像你在做飯,舀了一些糖放進一個小罐子,然後在上面貼了張標籤,寫著「糖」。從此你不再去想那一堆具體的晶體——你只說「糖」,伸手就拿那個罐子。變數(variable)正是這個罐子:一個有名字的盒子,你把一個值存進去,之後就能用名字去取它,而不必記住那個值本身。
為什麼要這麼做?因為程式要同時擺弄許多值——玩家的分數、某人的名字、一杯咖啡的價格——而這些值在程式執行時會不斷變化。變數給每個值一個可以抓住的「把手」。你寫一次名字,程式就會悄悄取出盒子裡此刻裝著的東西。
給盒子取名,往裡放東西
建立一個變數分兩步:取一個名字,再放一個值進去。在大多數語言裡,等號 = 負責「放進去」這部分。別把它讀成「等於」,而要讀成一個箭頭:「把這個值,存進這個盒子裡」。名字寫在左邊,值寫在右邊。
score = 0 name = "Mira" score = score + 10 # the box now holds 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(數字)看起來像,行為卻不同,所以當算術讓你意外時,先檢查型別,再說別的。掌握這兩個想法,程式設計的其餘部分就有了一塊結實的立足之地。