本文共 990 字,大约阅读时间需要 3 分钟。
浅拷贝就是对引用的拷贝,深拷贝就是对对象资源的拷贝。
1.赋值1.赋值是将一个对象的地址赋值给一个变量,让变量指向该地址;2.修改不可变对象(字符串、数组等)需要给出新的空间;3.修改可变对象(列表、字典等)不需要给出新空间。2.浅拷贝
浅拷贝(切片、工厂函数、对象的copy()方法、copy模块中的copy函数)仅仅复制了存储空间中内容的地址>>> a = ['huhu', [1, 2]]>>> b = a[:]>>> [id(x) for x in a][48401856, 48131728]>>> [id(x) for x in b][48401856, 48131728]>>> a[0] = 'haha'>>> a[1].append(3)>>> a['haha', [1, 2, 3]]>>> b['huhu', [1, 2, 3]]
从上面的代码可以看出,a和b没有修改前都是指向一个存储空间的,即他们的内容和地址都是相同的。当a修改时,因为字符串是不可变对象,所以需要给出新的存储空间来指定新的字符串,而列表就不用,所以b中字符串改变了,列表没变。(相当于一台电脑,a可以用,然后b也想用,a就把可以使用这台电脑的权限赋予b,这样ab公用这台电脑)
3.深拷贝
深拷贝完全拷贝了一个副本,存储空间内容和地址都不一样。深拷贝只有一种方式:copy模块中的deepcopy函数。>>> from copy import deepcopy>>> a = ['huhu', [1, 2]]>>> b = deepcopy(a)>>> [ id(x) for x in a][48401856, 48134104]>>> [ id(x) for x in b][48401856, 48333048]>>> a[0] = 'haha'>>> a[1].append(3)>>> a['haha', [1, 2, 3]]>>> b['huhu', [1, 2]]
从这里可以看出深拷贝是完全拷贝出来一个副本,重新给了一个存储空间赋值给b,内容和地址与a不同。(相当于一台电脑,a可以用,然后b也想用,a就给b买了一台一模一样的电脑使用,这样a用a的电脑,b用b的电脑)
转载于:https://blog.51cto.com/11838292/2048136