可变对象和不可变对象
在Pyhton中
- 不可变对象指:一旦创建就不可修改的对象,包括字符串,元组,数字;
- 可变对象指:可以修改的对象,包括:列表、字典。
>>> L1 = [2,3,4] #L1变量指向的是一个可变对象:列表
>>> L2 = L1 #将L1值赋给L2后,两者共享引用同一个列表对象[1,2,3,4]
>>> L1[0] = 200 #因为列表可变,改变L1中第一个元素的值
>>> L1; L2 #改变后,L1,L2同时改变,因为对象本身值变了
[200, 3, 4]
[200, 3, 4]
如果不想改变列表L2的值,有切片和使用copy模块两种方法。
>>> L1 = [2,3,4]
>>> L2 = L1
>>> id(L1);id(L2) #共享引用一个可变对象
45811784L
45811784L
>>> L2 = L1[:] #切片操作
>>> id(L1);id(L2) #切片后,对象就不一样了
45811784L
45806920L
>>> L1[0] = 200
>>> L1;L2 #L1发生改变,L2没有变化
[200, 3, 4]
[2, 3, 4]
拷贝
切片技术可以应用于所有的序列,包括列表、字符串、元组等。
但切片不能应用于字典,对字典只能使用Dic.copy()方法或者Dic.deepcopy()方法。
深浅拷贝,即可用于序列,也可用于字典。
import copy
X = copy.copy(Y) #浅拷贝:只拷贝顶级的对象,或者说:父级对象
X = copy.deepcopy(Y) #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象
如果字典只有顶级对象:
如果字典中有嵌套对象:
结论
-
深浅拷贝都是对源对象的复制,占用不同的内存空间;
-
如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象;
-
如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝;
-
序列对象的切片其实是浅拷贝,即只拷贝顶级的对象。