Python的浅拷贝和深拷贝

总结

本文介绍了对象的赋值和拷贝,以及它们之间的差异:

  • Python中对象的赋值都是进行对象引用(内存地址)传递
  • 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
  • 如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有被拷贝一说
  • 如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子

参考:图解 Python 深拷贝和浅拷贝

1:对象的赋值

Python中,对象的赋值都是进行对象引用(内存地址)传递

will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = will

由于will和wilber指向同一个对象,所以对will的任何修改都会体现在wilber上

2:浅拷贝

import copy
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.copy(will)

浅拷贝会创建一个新的对象,这个例子中”wilber is not will”
但是,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址),也就是说”wilber[i] is will[i]”

当我们使用下面的操作的时候,会产生浅拷贝的效果:

使用切片[:]操作
使用工厂函数(如list/dir/set)
使用copy模块中的copy()函数

3:深拷贝

跟浅拷贝类似,深拷贝也会创建一个新的对象,这个例子中”wilber is not will”
但是,对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单的使用原始元素的引用(内存地址)

import copy
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.deepcopy(will)

你可能感兴趣的:(Python的浅拷贝和深拷贝)