3.1.1 对象不是盒子

C 语言中我们定义变量用到的语法是:

int a = 1;

这背后的含义是定义了一个 int 类型的变量 a,相当于申请了一个名为 a 的盒子(存储空间),里面装了数字 1。

然后我们改变 a 的值:a = 2;,可以打印 a 的地址来证明它并没有发生变化。所以只是盒子里装的内容(指针指向的位置)发生了改变:

但是在 Python 中,变量不是盒子。比如同样的定义变量:

a = 1

这里就不能把 a 理解为 int 类型的变量了。因为在 Python 中,变量没有类型,值才有,或者说只有对象才有类型。因为即使是数字 1,也是 int 类的实例,而变量 a 更像是给这个对象贴的一个标签。

如果执行赋值语句 a = 2,相当于把标签 a贴在另一个对象上:

基于这个认知,我们现在应该更容易理解 2.2.1 节中所说的函数传参规则了。如果传入的是不可变类型,比如 int,改变它的值实际上就是把标签挂在新的对象上,自然不会改变原来的参数。如果是可变类型,并且做了修改,那么函数中的变量和外面的变量都是指向同一个对象的标签,所以会共享变化。

Last updated