python中深浅拷贝

2020-05-11  本文已影响0人  飞跑的蛤蟆

在看深浅拷贝之前,我们先看下赋值操作:

  1. 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址
  2. 修改不可变对象(str、tuple)需要开辟新的空间
  3. 修改可变对象(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的内存驻留机制(小数据池)了

上一篇 下一篇

猜你喜欢

热点阅读