在看深浅拷贝之前,我们先看下赋值操作:
- 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址
- 修改不可变对象(str、tuple)需要开辟新的空间
- 修改可变对象(list等)不需要开辟新的空间
python中所谓的浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象资源的拷贝。
In [52]: f
Out[52]: [5, [6, 7, 8]]
In [53]: id(f)
Out[53]: 1491958758152
In [54]: [id(i) for i in f]
Out[54]: [1937866992, 1491987444104]
In [55]: g = f
In [56]: id(g)
Out[56]: 1491958758152
In [57]: [id(i) for i in g]
Out[57]: [1937866992, 1491987444104]
In [58]: h = f.copy() # 浅拷贝
In [59]: id(h)
Out[59]: 1491987682568
In [60]: [id(i) for i in h]
Out[60]: [1937866992, 1491987444104]
In [61]: m = f[:] # 这个也算是浅拷贝
In [62]: id(m)
Out[62]: 1491987751240
In [63]: [id(i) for i in m]
Out[63]: [1937866992, 1491987444104]
In [64]: from copy import deepcopy
In [65]: n = deepcopy(f) # 深拷贝
In [66]: n
Out[66]: [5, [6, 7, 8]]
In [67]: id(n)
Out[67]: 1491958481928
In [68]: [id(i) for i in n]
Out[68]: [1937866992, 1491956407176]
由上面的代码示例可知,浅拷贝是为拷贝对象开辟一个内存地址,拷贝对象中的元素地址是指向旧对象的内存地址的。深拷贝也是为拷贝对象新建一个内存地址,但是拷贝对象中的元素地址也是新开辟的,只是它们的值一样罢了。
但是上面深拷贝的例子中,数字5的内存地址也是没有变化的,这是为啥呢?不是说好重新开辟的嘛
这就涉及到python的内存驻留机制(小数据池)了










网友评论