Python 装饰器、浅拷贝和深拷贝 装饰器(Decorator) 装饰器是Python中一种用于修改或扩展函数行为的工具。它本质上是一个高阶函数,接受一个函数作为参数,并返回一个新的函数。 示例: def my_decorator(func): def wrapper(): print("Before function call") func() print("After function call") return wrapper @my_decorator def say_hello(): print("Hello!") say_hello() 输出: Before function call Hello! After function call 关键点: - 装饰器使用 @ 语法糖,放在函数定义的上方。 - 装饰器可以用于日志记录、权限检查、性能测试等场景。 - 装饰器可以嵌套,多个装饰器会从下往上依次执行。 浅拷贝(Shallow Copy) 浅拷贝创建一个新对象,但不会递归复制对象内部的子对象。它只复制对象的引用。 实现方式: - 使用 copy.copy() 函数。 - 使用对象的 copy() 方法(如果对象支持)。 示例: import copy original = [[1, 2, 3], [4, 5, 6]] shallow_copied = copy.copy(original) 修改浅拷贝后的对象 shallow_copied[0][0] = 99 print("Original:", original) print("Shallow Copied:", shallow_copied) 输出: Original: [[99, 2, 3], [4, 5, 6]] Shallow Copied: [[99, 2, 3], [4, 5, 6]] 关键点: - 浅拷贝只复制最外层的对象,内部的子对象仍然是共享的。 - 修改浅拷贝对象中的可变子对象(如列表、字典)会影响原始对象。 深拷贝(Deep Copy) 深拷贝会递归复制对象及其所有子对象,创建一个完全独立的副本。 实现方式: - 使用 copy.deepcopy() 函数。 示例: import copy original = [[1, 2, 3], [4, 5, 6]] deep_copied = copy.deepcopy(original) 修改深拷贝后的对象 deep_copied[0][0] = 99 print("Original:", original) print("Deep Copied:", deep_copied) 输出: Original: [[1, 2, 3], [4, 5, 6]] Deep Copied: [[99, 2, 3], [4, 5, 6]] 关键点: - 深拷贝会递归复制所有子对象,创建一个完全独立的副本。 - 修改深拷贝对象不会影响原始对象。 - 深拷贝的性能开销较大,尤其是对于嵌套层次较深的对象。 浅拷贝 vs 深拷贝 特性:复制范围,浅拷贝只复制最外层对象,深拷贝递归复制所有子对象。 特性:子对象是否独立,浅拷贝子对象是共享的,深拷贝子对象是独立的。 特性:性能,浅拷贝较快,深拷贝较慢(尤其是嵌套层次深的对象)。 特性:适用场景,浅拷贝适用于对象结构简单,无嵌套可变对象;深拷贝适用于对象结构复杂,有嵌套可变对象。 总结 - 装饰器:用于扩展函数行为,语法简洁,功能强大。 - 浅拷贝:只复制外层对象,子对象共享,适合简单对象。 - 深拷贝:递归复制所有对象,完全独立,适合复杂对象。
点赞 评论

相关推荐

上来问了一下你确定你投递的是测试开发岗位?(简历上是后端,现在不应该心照不宣了吗)自我介绍项目拷打:(真的很希望看到别人项目拷打的问题,我都编不下去了)选择一个项目进行介绍(选了天机学堂)介绍你在这个项目中干了什么你们这个项目听着挺大的,全是你开发做的吗你们这个项目上线了吗,如果上线了,你觉得用户量会达到多少,我说了几千到几万?那么这个值是怎么估计得到的,我说这种在线教育用户范围限定的比较死,面试官应该想听更详细的估算方法?项目中的接口,上线了你有哪些指标来衡量它的好坏你怎么测试你接口的好坏?测试相关:测试用例,微信红包(大概就是围绕功能,性能,安全,边界值,兼容性去说)八股:Redis可以做什么(签到,GEO查找,缓存重点结合项目说,分布式锁,结合项目登录校验取代session)Mysql的索引讲一下(聚簇索引,二级索引;普通、唯一索引;单列多列索引,主要是重点说聚簇下b+树的结构展开多说了点)Linux常用命令(rm,mkdir,cp,cd,ls,grep,ps,sudo这些都说了)Linux远程传输文件的命令(不知道)代码Sql(给定一个成绩表,包括姓名,科目,成绩)1.请找出语文成绩排名前10的姓名2.请找出名字李开头的人的总成绩(模糊+count)算法:二分查找(提前下好客户端,我浏览器打开会看不到题目,只能自己共享屏幕本地编译)反问:业务相关,搜索部门好像是多久出结果(明天)第一次面试需要改进的地方,感觉算法和八股面试官觉得还行,说我项目那里还得练(反正问点场景我不知道的我就老实开摆)人生第二面,其实也是首面,下午刚面第一面,希望大家指正有点迷茫,不知道接下来该朝哪方向努力,本来准备后端的,结果后端无人问津测开被约三次了,现在应该补充点测开系统知识吗,能不能两手抓,这种网上的项目怎么装的像真要上线一样啊,实在脸皮薄不会撒谎,感觉一问都是漏洞,真心赐教。
查看15道真题和解析
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务