核心想法:一个有名字的盒子
想象你在做饭,舀了一些糖放进一个小罐子,然后在上面贴了张标签,写着「糖」。从此你不再去想那一堆具体的晶体——你只说「糖」,伸手就拿那个罐子。变量(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(数字)看起来像,行为却不同,所以当算术让你意外时,先检查类型,再说别的。掌握这两个想法,编程的其余部分就有了一块结实的立足之地。