python中变量的实现方式是引用语义,什么意思呢,就是python中的变量是对应的是内存地址;与之相对应的是 值语义,即变量对应的是真实值,例如C语言。有一种更好的理解方式,把变量看成是一种代号,它的唯一作用就是方便开发者牢记和书写,这样的话引用语义中变量是内存地址的代表,值语义中变量是值的代表。
Python数据类型
既然python中的变量实现方式是引用语义,那么变量代表的内存空间中存储的是什么呢?内存空间中可以存两种类型的东西,一个是值,另一个是内存地址,其中存储值的变量对应的是不可变数据类型,存储内存地址的变量对应的是可变数据类型。如下图所示。
python中不可变数据类型有boolean(有两个值True、False)、int、long、float、str、tuple,可变数据类型有list、dict。
Python中赋值
对于不可变数据类型,不同的值会分配不同的内存空间,但是对于相同的值,系统只会分配一个内存空间,他们共用同一个内存空间;对于可变数据类型,不管值是否相同,会为每个值分别分配内存空间。如下图所示。
由于整数1是不可变数据类型,因此a和b代表的是同一个内存地址,而[1,2,3]是可变数据类型,因此c和d代表的是不同的内存地址。
Python中=、浅拷贝和深拷贝
python中的=,做的仅仅是为同一个内存地址贴上更多的代号,即将新的变量指向该内存地址。如下图。
不管是可变数据类型还是不可变数据类型,=操作仅仅将新的变量指向原来的内存地址,这样的话同一个内存地址便有多个变量指向它,也就有多个代号了。
对于浅拷贝和深拷贝的区别,浅拷贝仅仅将变量对应的内存地址复制了一份,生成了一个新的内存地址,而深拷贝除了将变量对应的内存地址复制了,它还将该内存地址中存储的内存地址复制生成了新的内存地址(如果该内存地址中存储的是内存地址,而不是一个简单的值的话)。举个例子:
对于变量对应的内存空间中存储的只有不可变值时,深浅拷贝的结果是一样的,它们分别得到了新的内存空间。
但是对于变量对应的内存空间中存储的有可变值时,深浅拷贝的结果是不一样的,由于浅拷贝并没有复制一份新的[1,2,3]对应的地址,所以变量a和a_shallow中[1,2,3]共用同一个内存地址,修改其中的值a和a_shallow的值都会变,但是由于深拷贝将[1,2,3]的地址也复制了一份新的,所以它的值并不会受影响。



