“你不开心,”白骑士用一种忧虑的声调说,“让我给你唱一首歌安慰你吧……这首歌的曲名叫作 :《黑线鳕的眼睛》。”
“哦,那是一首歌的曲名,是吗?”爱丽丝问道,她试着使自己感到有兴趣。
“不,你不明白,”白骑士说,看来有些心烦的样子,“那是人家这么叫的曲名。真正的曲名是《老而又老的老头儿》。”(改编自第 8 章“这是我自己的发明”)
——Lewis Carroll
《爱丽丝镜中奇遇记》
爱丽丝和白骑士为本章要讨论的内容定了基调。本章的主题是对象与对象名称之间的区别。名称不是对象,而是单独的东西。
本章先以一个比喻说明 Python 的变量:变量是标注,而不是盒子。如果你不知道引用式变量是什么,可以像这样对别人解释别名。
然后,本章讨论对象标识、值和别名等概念。随后,本章会揭露元组的一个神奇特性:元组是不可变的,但是其中的值可以改变,之后就引申到浅复制和深复制。接下来的话题是引用和函数参数:可变的参数默认值导致的问题,以及如何安全地处理函数的调用者传入的可变参数。
本章最后一节讨论垃圾回收、del 命令,以及如何使用弱引用“记住”对象,而无需对象本身存在。
本章的内容有点儿枯燥,但是这些话题却是解决 Python 程序中很多不易察觉的 bug 的关键。
首先,我们要抛弃变量是存储数据的盒子这一错误观念。