关注
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 深拷贝
特性:复制范围,浅拷贝只复制最外层对象,深拷贝递归复制所有子对象。
特性:子对象是否独立,浅拷贝子对象是共享的,深拷贝子对象是独立的。
特性:性能,浅拷贝较快,深拷贝较慢(尤其是嵌套层次深的对象)。
特性:适用场景,浅拷贝适用于对象结构简单,无嵌套可变对象;深拷贝适用于对象结构复杂,有嵌套可变对象。
总结
- 装饰器:用于扩展函数行为,语法简洁,功能强大。
- 浅拷贝:只复制外层对象,子对象共享,适合简单对象。
- 深拷贝:递归复制所有对象,完全独立,适合复杂对象。
查看原帖
点赞 评论
相关推荐
02-02 20:04
National University of Singapore Java 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
6956次浏览 104人参与
# 机械人避雷的岗位/公司 #
41980次浏览 280人参与
# 程序员找工作至少要刷多少题? #
12863次浏览 201人参与
# 12306一秒售罄,你抢到回家的票了吗? #
1151次浏览 39人参与
# 我现在比当时_,你想录用我吗 #
5733次浏览 89人参与
# 过年最难忘的一件事 #
23058次浏览 174人参与
# 你最满意的offer薪资是哪家公司? #
69498次浏览 349人参与
# 为了减少AI幻觉,你注入过哪些设定? #
2624次浏览 97人参与
# 牛客AI体验站 #
4784次浏览 143人参与
# AI Coding的使用心得 #
3484次浏览 91人参与
# 找工作的破防时刻 #
253111次浏览 1960人参与
# 刚入职的你踩过哪些坑 #
5338次浏览 113人参与
# 论秋招对个人心气的改变 #
7333次浏览 130人参与
# 一张图晒一下你的AI员工 #
3599次浏览 82人参与
# 关于春招/暑期实习,你想知道哪些信息? #
5366次浏览 98人参与
# 黄金这个事上,你学到了什么 #
1279次浏览 41人参与
# 机械人你知道哪些单休企业 #
85464次浏览 428人参与
# 程序员能干到多少岁? #
6767次浏览 104人参与
# 晒晒你司的新年福利 #
5538次浏览 89人参与
# 关于提前批我想问 #
267471次浏览 2307人参与
OPPO公司福利 1091人发布