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