3.1.1 对象不是盒子
C 语言中我们定义变量用到的语法是:
这背后的含义是定义了一个 int 类型的变量 a,相当于申请了一个名为 a 的盒子(存储空间),里面装了数字 1。
然后我们改变 a
的值:a = 2
;,可以打印 a
的地址来证明它并没有发生变化。所以只是盒子里装的内容(指针指向的位置)发生了改变:
但是在 Python 中,变量不是盒子。比如同样的定义变量:
这里就不能把 a
理解为 int
类型的变量了。因为在 Python 中,变量没有类型,值才有,或者说只有对象才有类型。因为即使是数字 1,也是 int
类的实例,而变量 a
更像是给这个对象贴的一个标签。
如果执行赋值语句 a = 2
,相当于把标签 a
贴在另一个对象上:
基于这个认知,我们现在应该更容易理解 2.2.1 节中所说的函数传参规则了。如果传入的是不可变类型,比如 int
,改变它的值实际上就是把标签挂在新的对象上,自然不会改变原来的参数。如果是可变类型,并且做了修改,那么函数中的变量和外面的变量都是指向同一个对象的标签,所以会共享变化。
Last updated