关注
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 深拷贝
特性:复制范围,浅拷贝只复制最外层对象,深拷贝递归复制所有子对象。
特性:子对象是否独立,浅拷贝子对象是共享的,深拷贝子对象是独立的。
特性:性能,浅拷贝较快,深拷贝较慢(尤其是嵌套层次深的对象)。
特性:适用场景,浅拷贝适用于对象结构简单,无嵌套可变对象;深拷贝适用于对象结构复杂,有嵌套可变对象。
总结
- 装饰器:用于扩展函数行为,语法简洁,功能强大。
- 浅拷贝:只复制外层对象,子对象共享,适合简单对象。
- 深拷贝:递归复制所有对象,完全独立,适合复杂对象。
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 怎么给家人解释你的工作? #
9524次浏览 66人参与
# 应届生被毁约被毁意向了怎么办 #
45017次浏览 278人参与
# 快手技术岗信息交流阵地 #
1072次浏览 13人参与
# 你的mentor是什么样的人? #
14112次浏览 102人参与
# 牛客周边新品开箱 #
9857次浏览 89人参与
# 帮我看看,领导说这话什么意思? #
18402次浏览 93人参与
# 求职中的尴尬瞬间 #
2654次浏览 35人参与
# 牛友的志愿填报指南 #
34129次浏览 185人参与
# 牛客树洞,我想对你说 #
6750次浏览 82人参与
# 求职低谷期你是怎么度过的 #
11430次浏览 237人参与
# 26届秋招公司红黑榜 #
26306次浏览 106人参与
# 校招泡的最久的公司是哪家? #
11368次浏览 76人参与
# 国企还是互联网,你怎么选? #
168775次浏览 1243人参与
# 从哪些方向判断这个offer值不值得去? #
14848次浏览 175人参与
# 得物app工作体验 #
27463次浏览 64人参与
# 今年形式下双非本找得到工作吗 #
236555次浏览 1430人参与
# 机械人集合!你是什么工程师? #
19423次浏览 91人参与
# 你觉得mentor喜欢什么样的实习生 #
15210次浏览 403人参与
# 小红书求职进展汇总 #
124945次浏览 969人参与
# 面试紧张时你会有什么表现? #
3386次浏览 37人参与
# 度小满求职进展汇总 #
11988次浏览 64人参与
百度公司福利 679人发布