📄 一句话概括
变量是给内存盒子贴的名字(随时能换内容),常量是贴完封条的盒子(约定不再改)——计算机【记忆】的本质就是往盒子里存数,名字只是给人用的标签。
📝 本节和前面几节的关系
3-3 的运算要有地方存放结果,存放点就是变量。回收 C++ 课 2.3(变量的声明及赋值)与树莓派课 6-3(Python 变量),那两处讲语法,这一篇讲【计算机到底记住了什么】。
一、变量:贴了名字的内存盒子
程序运行时,数据存在内存里。内存是按字节编号的一排格子(3-14 会展开讲),变量就是:
- 找一块大小合适的空格子(按类型分配字节数);
- 把数据放进去;
- 给这块格子贴一个名字。
之后代码里写 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 【魔法数字】问题的正面解法。
三、命名:名字是写给三个月后的自己看的
- 见名知义:
price优于a、student_count优于sc; - 蛇形命名
student_count(Python 惯例)与驼峰命名studentCount(Java/JS 惯例),进哪个仓库入哪个乡; - 回收树莓派课 6-3 的纪律:别用中文变量名(编码与输入法都是隐患);
- 变量名不能和保留字撞车(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 见)。
六、常见误区
- 【Python 的全大写常量是硬约束】——错。它只是写给读代码的人的牌子,语法上照样能改;真正的封条要靠 C++ 的 const、Java 的 final。
- 【变量是数学里的未知数】——错。数学的 x 是【待解的固定值】,程序的变量是【随时可换的盒子】——
x = x + 1在程序里天经地义。 - 【变量名越短越好】——错。省下的几个键击,要用三倍时间找回来:
s是什么?字符串、分数还是秒?
自测三问(点开对答案)
1. **变量和常量的核心区别?** 答:变量内容随时可换,常量约定初始化后不再改——差别不在机器层面,在【谁有权改】的约定与检查。 2. **为什么常量名习惯全大写?** 答:Python 没有真常量,全大写是社区约定的视觉警报——提醒读代码的人【这盒子有封条,别动】。 3. **`x = x + 1` 在数学上为什么不成立?** 答:数学等式两边必须同时成立(推出 0 等于 1,矛盾);程序里它是【取出 x 的值加一,再装回 x】的两步操作。- ☐ 下一节(3-5 值、代入、比较运算符)
相关笔记
- 值、代入、比较运算符 —— 等号两副面孔的完整展开
- C++ 2.3 · 变量 —— 声明加赋值的完整语法
- 树莓派 6-3 · Python 变量与运算符 —— 动态类型的赋值
- ⌨️ 编程原理 · 索引 —— 全课路线图