名字要能解释它装的是什么。多打二十个字符,换以后每次读都不用猜。
赋值不是等式:x = x + 1 念作「把右边算完,放进左边的盒子」。
对调两个盒子的值,Python 一行就够;换到 C 里得借第三个盒子。
上一篇讲盒子,这一篇讲盒子上贴什么标签、怎么往里面放东西。 教材这一节有五个小标题,说的其实是三件事:起名、赋值、类型。 其中「变量也有数据类型」这一小条最容易误解,这一篇会点明它是分语言的。
一、名字能起什么,不能起什么
规则只有三条:字母或下划线开头、只含字母数字下划线、不能是关键字。
演示里那张表把常见的错都列了:2nd_score 数字开头、max-score 有减号、for 是关键字。
还有一条能用但不该用的:Python 认中文变量名。能跑,但团队里混两种语言最费劲。
规则管的是「能不能跑」,约定管的是「好不好读」。两件事别混。
二、名字长短,差的是读的时间
演示里比了三种写法要打多少字符:48、72、96。 注意这三个数是手数的,不是跑出来的,第三列「三个月后还认得出吗」是判断,不是数据。 能说清的只有一句:多打二十个字符,换的是以后每次读都不用猜。
教材给的规矩很朴素:名字要能解释它装的是什么。
pass_count 比 c 好,不是因为它长,是因为它说了话。
反过来说,名字也不能长到看不见重点。
score_of_the_student_in_class 这种,通常说明这个变量承担了太多含义——该拆了。
三、赋值不是等式
x = 5 之后连做三次 x = x + 1,得到 6、7、8。
数学里 x = x + 1 无解,代码里它天天出现。因为这里的等号念「放进」,不是「等于」。
右边先算完,再把结果放进左边的盒子。
这个顺序不能反——5 = x 会直接报错,因为左边必须是「能放东西的地方」。
理解这一点,才能看懂 total += x 这种写法:它是 total = total + x 的缩写,
不是「total 等于 x」。
四、对调两个盒子,以及类型的另一件事
演示里 a, b = b, a 一行就对调了。Python 先把右边算成一个元组再拆开。
换到 C 或 Java 就得借第三个盒子:t = a; a = b; b = t。
这个「借盒子」的动作,就是第 5 章排序里最常做的事。
教材 2.11 说「变量也有数据类型」。
这句话在不同语言里含义不同:Python 里变量本身没有类型,是它指向的值有类型。
所以 Python 里可以先 x = 1 再 x = 'abc',能跑;C 里这么写编译器直接拦。
这不叫「Python 松散」,叫「类型检查发生在运行时」。
代价是:类型错在 Python 里要等跑到那一行才报。
这也是为什么后面的 Demo 都真跑——不跑不知道哪一句会炸。
五、动手 Demo:起名、赋值、对调:三件事一次看完
先看哪些名字合法、哪些不合法。 再看名字长短对读代码的影响(注意:只有字符数是数的)。 最后验证赋值语句的行为,以及对调两个值。
score = 90 # 合法
max_score = 90 # 合法
2nd_score = 90 # 报错:数字开头
for = 90 # 报错:是关键字
x = 5
x = x + 1 # 不是等式,是「算完再放进去」
a, b = 1, 2
a, b = b, a # Python 一行对调
实跑输出:
--------------------------------------------------------------------
变量命名与赋值语句
--------------------------------------------------------------------
① 名字能起什么、不能起什么
--------------------------------------------------------------------
| 名字 | 合法吗 | 原因 |
|---|---|---|
| score | 能 | 字母开头,小写 |
| max_score | 能 | 下划线连接两个词 |
| 2nd_score | 不能 | 数字开头 |
| max-score | 不能 | 减号被当成运算 |
| for | 不能 | 是关键字,语言自己要用 |
| 总分 | 能 | Python 认中文,但多数团队不用 |
Python 允许中文变量名,这一条只是「能用」,不是「该用」。
团队里混着两种语言的标识符,读起来最费劲。
② 名字长短,读起来差多少
--------------------------------------------------------------------
| 写法 | 一段统计代码要打多少字符 | 三个月后还认得出吗 |
|---|---:|---|
| a、b、c、d | 48 | 要顺着上下文倒推 |
| cnt、sum、avg、mx | 72 | 大致猜得到 |
| pass_count、score_sum… | 96 | 不用猜 |
(字符数是按这一段统计代码手数的,不是跑出来的;第三列是判断,不是数据。)
教材给的规矩很朴素:名字要能解释它装的是什么。多打二十个字符,换的是以后每次读都不用猜。
③ 赋值语句不是等式
--------------------------------------------------------------------
x = 5
第 1 次 x = x + 1 -> x = 6
第 2 次 x = x + 1 -> x = 7
第 3 次 x = x + 1 -> x = 8
数学里 x = x + 1 无解,代码里它天天出现。因为这里的等号念作「放进」,不是「等于」。
右边先算完,再把结果放进左边的盒子。
④ 把两个盒子的值对调
--------------------------------------------------------------------
换之前:a = 1,b = 2
换之后:a = 2,b = 1
Python 一行就够,因为它先把右边算成一个元组再拆开
换到 C 或 Java 就得借第三个盒子:t = a; a = b; b = t。
第 4 章还会专门讲这个「借盒子」的技巧,因为它是排序里最常做的动作。
①第一张表六行,前两行能跑,中间三行报错,最后一行「能跑但别用」。
②第二张表第二列是字符数(手数的),第三列是判断。演示里已经把这一点写明了。
③第三段 x 从 5 变成 6、7、8。每跑一次 x = x + 1,盒子里的东西就换一次。
④第四段对调完是 a=2、b=1。Python 这一行背后是先建元组再拆开,所以不用临时变量。
⑤最后那句「换到 C 里得借第三个盒子」是第 5 章排序的伏笔:交换是排序里最频繁的动作。
30 秒实验
- 把
pass_count改回c,过一天再读那段代码,看还能不能一眼看懂。 - 写一行
x = x * 2跑五次,猜结果再验证。 - 用三种写法对调 a、b(借盒子、加减法、异或),看哪种最好读。
常见误区
- 「变量名短一点打得快。」省的是几秒,花的是以后每次读的时间。
- 「
x = x + 1是个方程。」不是。等号是「放进」,右边先算。 - 「Python 变量没有类型所以随便用。」类型在值上,错要到运行时才炸。
自测三问(点开对答案)
1. 为什么 `2nd_score` 不能当变量名? —— 数字开头。变量名必须以字母或下划线开头。 2. `x = x + 1` 怎么念? —— 把右边算完,把结果放进左边的盒子。不是「x 等于 x 加 1」这个方程。 3. Python 里对调两个变量为什么一行就够? —— 先把右边算成一个元组,再拆开赋给左边。C 里得借第三个临时变量。一个盒子装一个值。要装一排名值怎么办?下一节的主角是数组和它的下标。
- ☐ (本篇完,下一篇 2.4 数组与下标)