当前位置:实例文章 » 其他实例» [文章]面试官:请你说下深、浅拷贝并且手写深、浅拷贝,我:你咋知道我只会这个?

面试官:请你说下深、浅拷贝并且手写深、浅拷贝,我:你咋知道我只会这个?

发布人: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()函数进行深拷贝。

以上就是浅拷贝和深拷贝的区别,以及手写浅拷贝和深拷贝函数的示例代码。

相关标签:
其他信息

其他资源

Top