📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
在 Python 中,拷贝对象时,会涉及到“浅拷贝”和“深拷贝”这两个概念。理解这两者的区别对于正确管理对象的内存和提高代码稳定性尤为重要。
1. 定义
浅拷贝(Shallow Copy):
浅拷贝创建一个新的对象,但并不递归拷贝对象内部的其他对象。换句话说,对于嵌套对象(如列表中的列表),浅拷贝只会复制最外层的对象引用,内部的对象仍然是原来的引用。
在 Python 中,可以使用 copy 模块中的 copy 函数来实现浅拷贝:
import copy
original_list = [1, 2, [3, 4]]
shallow_copied_list = copy.copy(original_list)
深拷贝(Deep Copy):
深拷贝则会递归复制对象及其内部所有的对象。这样,新的对象与原对象完全独立,修改一个不会影响另一个。
也可以通过 copy 模块中的 deepcopy 函数实现深拷贝:
import copy
original_list = [1, 2, [3, 4]]
deep_copied_list = copy.deepcopy(original_list)
2. 区别
主要区别是处理引用的方式:
浅拷贝:创建一个新的容器,但内部对象仍引用原容器的对象。对内部对象的修改会影响到原对象。
深拷贝:创建一个新的容器并完全复制原有对象,包括所有嵌套的对象。对任何对象的修改都不会影响原对象。
3. 应用场景
浅拷贝的应用场景:
当我们希望创建一个新对象,但希望保留对内部对象的共享引用时,使用浅拷贝。例如,当我们在多个地方只需读取同一组数据,而不希望互相干扰的时候。
深拷贝的应用场景:
当我们需要在处理复杂的嵌套对象时,确保操作的是一个完全独立的副本。例如,将一个数据结构作为参数传递给函数,防止在函数内部改变其内容。
4. 注意事项
性能:深拷贝通常比浅拷贝慢,因为它需要递归复制所有对象,这可能涉及更高的开销。
循环引用:深拷贝会处理循环引用,而浅拷贝则在遇到循环引用时可能会导致错误或无限递归。
自定义对象:对于自定义类,需要确保类实现了 copy 和 deepcopy 方法,以便正确执行浅拷贝和深拷贝。
不可变类型:对于字符串、元组等不可变类型,通常不需要担心使用浅拷贝或深拷贝的区别。
5. 可能产生的问题
数据共享:使用浅拷贝时,可能出现意外的数据共享和状态改变,导致难以调试的错误。
性能问题:在需要频繁创建拷贝的场景下,深拷贝可能导致性能瓶颈,尤其是对于大对象。
对象限制:对某些复杂数据结构(如含有线程、打开文件等)的深拷贝可能会失败或引发异常,应根据需求小心操作。
示例代码:深拷贝与浅拷贝的区别
为了更好地理解深拷贝和浅拷贝的区别,以下是一个示例代码,展示了对嵌套列表的修改后,浅拷贝和深拷贝之间的不同结果。
import copy
# 原始列表
original_list = [1, 2, [3, 4]]
# 创建浅拷贝
shallow_copied_list = copy.copy(original_list)
# 创建深拷贝
deep_copied_list = copy.deepcopy(original_list)
# 修改原始列表中的嵌套列表
original_list[2][0] = 'Changed'
# 打印结果
print("原始列表:", original_list)
print("浅拷贝后的列表:", shallow_copied_list)
print("深拷贝后的列表:", deep_copied_list)
输出结果:
原始列表: [1, 2, ['Changed', 4]]
浅拷贝后的列表: [1, 2, ['Changed', 4]]
深拷贝后的列表: [1, 2, [3, 4]]
如上所示:
修改 original_list 中嵌套的列表时,浅拷贝(shallow_copied_list)也受到影响,因为它仍然引用同一个内部列表。
而深拷贝(deep_copied_list)则保持了原来的值,没有受到 original_list 的影响。
结论
理解深拷贝和浅拷贝的区别及其应用场景,对确保 Python 代码的正确性和高效性至关重要。根据实际情况合理选择拷贝方式,以提高程序的可维护性和避免潜在问题。在编程时总是要小心,明确你的数据行为,以确保其符合预期。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保证100%免费】