关注
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 深拷贝
特性:复制范围,浅拷贝只复制最外层对象,深拷贝递归复制所有子对象。
特性:子对象是否独立,浅拷贝子对象是共享的,深拷贝子对象是独立的。
特性:性能,浅拷贝较快,深拷贝较慢(尤其是嵌套层次深的对象)。
特性:适用场景,浅拷贝适用于对象结构简单,无嵌套可变对象;深拷贝适用于对象结构复杂,有嵌套可变对象。
总结
- 装饰器:用于扩展函数行为,语法简洁,功能强大。
- 浅拷贝:只复制外层对象,子对象共享,适合简单对象。
- 深拷贝:递归复制所有对象,完全独立,适合复杂对象。
查看原帖
点赞 评论
相关推荐
查看13道真题和解析 点赞 评论 收藏
分享
点赞 评论 收藏
分享
查看6道真题和解析 点赞 评论 收藏
分享
11-04 23:08
江苏省通州高级中学 客户端开发 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 什么是优秀的实习经历 #
9005次浏览 220人参与
# 实习简历求拷打 #
14815次浏览 176人参与
# 被上班搭子“传染”了哪些习惯 #
5977次浏览 100人参与
# 秋招被挂春招仍然能投的公司 #
7301次浏览 103人参与
# 工作后,你落下了哪些病根 #
14157次浏览 192人参与
# 作业帮求职进展汇总 #
83658次浏览 548人参与
# 外包能不能当跳板? #
54219次浏览 256人参与
# mt对你说过最有启发的一句话 #
37914次浏览 451人参与
# 一起聊美团 #
307434次浏览 1764人参与
# 摸鱼被leader发现了怎么办 #
102865次浏览 654人参与
# 京东开奖 #
631851次浏览 3180人参与
# 投格力的你,拿到offer了吗? #
153165次浏览 818人参与
# 秋招特别不鸣谢 #
16246次浏览 184人参与
# 考研失败就一定是坏事吗? #
201917次浏览 1381人参与
# 选实习,你更看重哪方面? #
14764次浏览 223人参与
# 安克创新求职进展汇总 #
62441次浏览 541人参与
# 京东美团大战,你怎么看? #
158258次浏览 861人参与
# 第一次面试 #
1036728次浏览 13683人参与
# 担心入职之后被发现很菜怎么办 #
266576次浏览 1134人参与
# 你今年的保底offer是哪家 #
155347次浏览 677人参与