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 深拷贝 特性:复制范围,浅拷贝只复制最外层对象,深拷贝递归复制所有子对象。 特性:子对象是否独立,浅拷贝子对象是共享的,深拷贝子对象是独立的。 特性:性能,浅拷贝较快,深拷贝较慢(尤其是嵌套层次深的对象)。 特性:适用场景,浅拷贝适用于对象结构简单,无嵌套可变对象;深拷贝适用于对象结构复杂,有嵌套可变对象。 总结 - 装饰器:用于扩展函数行为,语法简洁,功能强大。 - 浅拷贝:只复制外层对象,子对象共享,适合简单对象。 - 深拷贝:递归复制所有对象,完全独立,适合复杂对象。