Python浅拷贝-深拷贝 解析

2019-05-10  本文已影响0人  越大大雨天

浅拷贝

copy.copy()

copy函数是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象

特性: 浅拷贝只会对可变类型第一层进行拷贝;

如何验证?

通过id()对比拷贝前后对象的内存地址,或直接用is方法判断拷贝前后对象内存地址是否相同。

验证示例:

深拷贝

copy.deepcopy

deepcopy函数是深拷贝, 只要发现对象有可变类型就会对该对象到最后一个可变类型的每一层对象就行拷贝, 对每一层拷贝的对象都会开辟新的内存空间进行存储。

深拷贝同样无法拷贝不可变类型:字符串、数字、元组。

# 不可变类型元组(需要特别注意)  
In [59]: a = (1,2)

In [60]: b = copy.deepcopy(a)

In [61]: id(a)
Out[61]: 2140688276424

In [62]: id(b)
Out[62]: 2140688276424
      
In [63]: a = (1,2,[1,3])

In [64]: b =copy.deepcopy(a)

    
# 此处虽然外层元组是不可变类型,但内存地址依然改变了,原因是深拷贝会对所有可变子对象进行拷贝,因此内部列表会被拷贝,内存地址改变
In [65]: id(a)
Out[65]: 2140685431720

In [66]: id(b)
Out[66]: 2140688106408
    
# 其内部的子列表被拷贝,内存地址改变,由于元组是不可变类型,内部改变,其本身地址也会改变。
In [67]: id(a[2])
Out[67]: 2140681195272

In [68]: id(b[2])
Out[68]: 2140687283336
# 其内部的不可变对象无法拷贝,内存地址不变
In [69]: id(a[1])
Out[69]: 1896906896

In [70]: id(b[1])
Out[70]: 1896906896
  

结论:

不可变类型进行深拷贝如果子对象没有可变类型则不会进行拷贝,而只 是拷贝了这个对象的引用,否则会对该对象到最后一个可变类型的每一层 对象就行拷贝, 对每一层拷贝的对象都会开辟新的内存空间进行存储

总结

上一篇 下一篇

猜你喜欢

热点阅读