Python变量的实现方式
python中变量的实现方式是引用语义
,什么意思呢,就是python中的变量对应的是内存地址;与之相对应的是 值语义
,即变量对应的是真实值,例如C语言
。有一种更好的理解方式,把变量看成是一种代号
,它的唯一作用就是方便开发者牢记和书写,这样的话引用语义
中变量是内存地址的代表,值语义
中变量是值的代表。
Python数据类型
既然python中的变量实现方式是引用语义
,那么变量代表的内存空间中存储的是什么呢?内存空间中可以存两种类型的东西,一个是值,另一个是内存地址,其中存储值的变量对应的是不可变数据类型
,存储内存地址的变量对应的是可变数据类型
。如下图所示。
python中不可变数据类型
有boolean
(有两个值True
、False
)、int
、long
、float
、str
、tuple
,可变数据类型
有list
、dict
。
Python中变量赋值
重点: 有一点必须牢记,即对于不可变数据类型
来说,相同的值具有唯一的内存空间地址,不同的值的内存空间地址是不同的;但是对于可变数据类型
来说,对于可变数据类型
,相同值对应的内存地址是否相同,和具体赋值方式有关。常见赋值方式有四种,分别是直接赋具体值
、=赋值
、浅拷贝
、深拷贝
,下面具体讨论:
1)不可变数据类型
对于不可变数据类型
来说,上面提到,相同值具有唯一的内存空间地址,所以四种赋值方式,他们会具有相同的内存地址,如下图:
2)可变数据类型——元素全为不可变数据类型
如上图所示,对于可变数据类型
,如果其所有元素都为不可变数据类型时,赋具体值
、浅拷贝
和深拷贝
这三种方式均会产生一个新的内存地址,=赋值
这种方式并不会产生新的内存地址。
继续看,由于其所有元素都为不可变数据类型,所以这些相同元素对应唯一的内存地址,如上图。
3)可变数据类型——元素中含有可变数据类型
如上图所示,对于可变数据类型
,如果其元素含有可变数据类型时,赋具体值
、浅拷贝
和深拷贝
这三种方式同样均会产生一个新的内存地址,=赋值
这种方式并不会产生新的内存地址,这是和第2)中情况一致的。但是,对于其中那个可变数据类型的元素的内存地址,不同赋值方式有所不同,如下图,赋具体值
方式仍然是产生新的内存地址,=赋值
仍然不产生新的内存地址,浅拷贝
发生了变化,其也不产生新的内存地址,而深拷贝
仍然产生新的内存地址。
小结一下,对于四种赋值方式,由于不可变数据类型,相同值具有唯一的内存地址,所以四种方式均不产生新的内存地址,他们内存地址相同;对于可变数据类型来说,不管其元素中是否含有可变数据类型,赋具体值
和深拷贝
都会为每一个可变数据类型赋予新的内存地址,=赋值
则会为每一个可变数据类型赋予相同的内存地址,而浅拷贝
只对最外层的可变数据类型赋予新的内存地址,里面的可变数据类型的元素是无法为其赋予新的内存地址的。
弄清楚了这些,那么碰到可变数据类型中的元素发生变化时就可以理清楚每个变量的值的变化情况了。