⌨️ 第三章 数值和数据的处理方法
📄 一句话概括

变量是给内存盒子贴的名字(随时能换内容),常量是贴完封条的盒子(约定不再改)——计算机【记忆】的本质就是往盒子里存数,名字只是给人用的标签。

📝 本节和前面几节的关系

3-3 的运算要有地方存放结果,存放点就是变量。回收 C++ 课 2.3(变量的声明及赋值)与树莓派课 6-3(Python 变量),那两处讲语法,这一篇讲【计算机到底记住了什么】。

一、变量:贴了名字的内存盒子

程序运行时,数据存在内存里。内存是按字节编号的一排格子(3-14 会展开讲),变量就是:

  1. 找一块大小合适的空格子(按类型分配字节数);
  2. 把数据放进去;
  3. 给这块格子贴一个名字。

之后代码里写 score,编译器/解释器就按名字找到那块格子。赋值 = 的意思是【把右边的值装进左边的盒子】——不是数学里的【两边相等】(3-5 专门讲这个区别)。

score = 92       # 建盒子、装值、贴名字
score = 95       # 换内容:旧值 92 被覆盖

二、常量:贴完封条的盒子

有些值从头到尾不该变:圆周率、最大重试次数、税率。常量就是把这类值命名后约定不改。但【封条】的严格程度各语言不同:

语言 做法 强制力
Python 命名全大写 PI = 3.14159 只是约定——语言本身不拦你改
C++ const double PI = 3.14159; 编译器拦截,改了就报错
Java final double PI = 3.14159; 编译器拦截

为什么费劲用常量不用字面量:代码里散落 50 个 3.14,哪天要改成 3.14159 就得找 50 处、漏一处就是 bug;常量只改一行。这就是 3-6 【魔法数字】问题的正面解法。

三、命名:名字是写给三个月后的自己看的

四、动手 Demo:盒子换内容,常量提醒

PI = 3.14159          # 常量:全大写是【请勿修改】的牌子
radius = 5            # 变量

area = PI * radius ** 2
print(area)           # 78.53975

radius = 10           # 变量可以换;PI 若被改,Python 不会报错——靠自觉
area = PI * radius ** 2
print(area)           # 314.159

看到什么算成功:输出 78.53975 和 314.159。

读结果:半径从 5 换成 10,面积从 78.5 变 314.2——盒子没动、内容换了;PI 始终是那个 PI。注意幂运算 radius ** 2 优先级高于乘法,等价于 PI * (radius ** 2)。

五、30 秒实验

跑 a = 5; b = a; a = 99; print(b)——输出 5。b 拿到的是赋值那一刻的值 5,不是【跟着 a 走的链接】(对整数成立;列表等复杂对象是另一回事,3-14 见)。

六、常见误区

  1. 【Python 的全大写常量是硬约束】——错。它只是写给读代码的人的牌子,语法上照样能改;真正的封条要靠 C++ 的 const、Java 的 final。
  2. 【变量是数学里的未知数】——错。数学的 x 是【待解的固定值】,程序的变量是【随时可换的盒子】——x = x + 1 在程序里天经地义。
  3. 【变量名越短越好】——错。省下的几个键击,要用三倍时间找回来:s 是什么?字符串、分数还是秒?
自测三问(点开对答案) 1. **变量和常量的核心区别?** 答:变量内容随时可换,常量约定初始化后不再改——差别不在机器层面,在【谁有权改】的约定与检查。 2. **为什么常量名习惯全大写?** 答:Python 没有真常量,全大写是社区约定的视觉警报——提醒读代码的人【这盒子有封条,别动】。 3. **`x = x + 1` 在数学上为什么不成立?** 答:数学等式两边必须同时成立(推出 0 等于 1,矛盾);程序里它是【取出 x 的值加一,再装回 x】的两步操作。

相关笔记