🧮 第2章 变量和数组
📄 一句话概括

名字要能解释它装的是什么。多打二十个字符,换以后每次读都不用猜。 赋值不是等式: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 秒实验

  1. 把 pass_count 改回 c,过一天再读那段代码,看还能不能一眼看懂。
  2. 写一行 x = x * 2 跑五次,猜结果再验证。
  3. 用三种写法对调 a、b(借盒子、加减法、异或),看哪种最好读。

常见误区

  1. 「变量名短一点打得快。」省的是几秒,花的是以后每次读的时间。
  2. 「x = x + 1 是个方程。」不是。等号是「放进」,右边先算。
  3. 「Python 变量没有类型所以随便用。」类型在值上,错要到运行时才炸。
自测三问(点开对答案) 1. 为什么 `2nd_score` 不能当变量名? —— 数字开头。变量名必须以字母或下划线开头。 2. `x = x + 1` 怎么念? —— 把右边算完,把结果放进左边的盒子。不是「x 等于 x 加 1」这个方程。 3. Python 里对调两个变量为什么一行就够? —— 先把右边算成一个元组,再拆开赋给左边。C 里得借第三个临时变量。

一个盒子装一个值。要装一排名值怎么办?下一节的主角是数组和它的下标。

相关笔记