面试官:请你说下深、浅拷贝并且手写深、浅拷贝,我:你咋知道我只会这个?
发布人:shili8
发布时间:2024-11-16 14:30
阅读次数:0
面试官:请你说下深、浅拷贝并且手写深、浅拷贝。
我:你咋知道我只会这个?
面试官:哈哈,这是我们公司常见的问题之一。好吧,先来说一下浅拷贝和深拷贝的区别。
浅拷贝(Shallow Copy)是指创建一个新的对象,并将原来的对象中的数据复制到新对象中。但是,如果原来的对象中包含了引用类型的数据(如数组或对象),那么浅拷贝只会复制这个引用,而不会复制引用的内容。也就是说,两个对象共享同样的内存空间。
深拷贝(Deep Copy)则是指创建一个新的对象,并将原来的对象中的所有数据(包括引用类型的数据)全部复制到新对象中。这样,两个对象就完全独立了,没有任何共享的内存空间。
举个例子:
import copy# 浅拷贝a = [1,2,3] b = a.copy() # b是浅拷贝aprint(id(a)) #139734111142656print(id(b)) #139734111142656print(a is b) # True# 深拷贝c = copy.deepcopy(a) print(id(a)) #139734111142656print(id(c)) #139734111143072print(a is c) # False
在这个例子中,我们创建了一个列表a,接着我们使用copy.copy()函数进行浅拷贝得到列表b。然后我们使用copy.deepcopy()函数进行深拷贝得到列表c。
可以看到,id(a)和id(b)是相同的,这意味着a和b共享同样的内存空间,而id(a)和id(c)是不同的,这意味着a和c完全独立,没有任何共享的内存空间。
现在,让我们手写一个浅拷贝函数:
def shallow_copy(obj): if isinstance(obj, list): return [shallow_copy(i) for i in obj] elif isinstance(obj, dict): return {k: shallow_copy(v) for k, v in obj.items()} else: return obj# 测试a = [1,2,3, {"x":4, "y":5}] b = shallow_copy(a) print(b) # [1,2,3, {'x':4, 'y':5}]
这个函数首先检查对象是否是列表或字典,如果是,则递归地对其元素进行浅拷贝。如果不是,则直接返回该对象。
最后,让我们手写一个深拷贝函数:
import copydef deep_copy(obj): if isinstance(obj, list): return [deep_copy(i) for i in obj] elif isinstance(obj, dict): return {k: deep_copy(v) for k, v in obj.items()} else: return copy.deepcopy(obj) # 测试a = [1,2,3, {"x":4, "y":5}] b = deep_copy(a) print(b) # [1,2,3, {'x':4, 'y':5}]
这个函数首先检查对象是否是列表或字典,如果是,则递归地对其元素进行深拷贝。如果不是,则使用copy.deepcopy()函数进行深拷贝。
以上就是浅拷贝和深拷贝的区别,以及手写浅拷贝和深拷贝函数的示例代码。