程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

Python内置copy模块:浅层及深层拷贝操作详解

balukai 2025-08-01 15:43:36 文章精选 1 ℃

一、引言

在Python编程中,对象的复制是一个常见的需求。然而,Python的赋值语句并不复制对象,而是创建目标和对象的绑定关系。为了生成对象的副本,Python提供了copy模块,支持浅层复制和深层复制操作。本文将详细介绍copy模块的使用方法、原理及相关知识点。

二、知识讲解

1. 赋值与复制

定义与原理

  • 赋值:Python中的赋值语句(如a = b)并不复制对象,而是创建一个新的变量a,并将其绑定到b所指向的对象上。这意味着ab指向同一个对象,对a的修改会影响到b
  • 复制:复制操作会创建一个新的对象,并将原对象的内容复制到新对象中。复制分为浅层复制和深层复制。

示例

a = [1, 2, 3]
b = a  # 赋值,a和b指向同一个对象
b[0] = 99
print(a)  # 输出: [99, 2, 3]

2. 浅层复制

定义与原理

  • 浅层复制:构造一个新的复合对象,然后将原始对象中找到的对象的引用插入其中。浅层复制只复制对象本身,而不复制对象内部的子对象。

函数原型

copy.copy(obj)
  • 参数obj - 需要复制的对象。
  • 返回值:返回obj的浅拷贝。

示例

import copy

a = [1, 2, [3, 4]]
b = copy.copy(a)  # 浅层复制
b[0] = 99
b[2][0] = 88
print(a)  # 输出: [1, 2, [88, 4]]
print(b)  # 输出: [99, 2, [88, 4]]

注意事项

  • 浅层复制只复制对象本身,而不复制对象内部的子对象。因此,修改子对象会影响到原对象和复制对象。

3. 深层复制

定义与原理

  • 深层复制:构造一个新的复合对象,然后递归地将在原始对象里找到的对象的副本插入其中。深层复制会复制对象及其所有子对象。

函数原型

copy.deepcopy(obj, memo=None)
  • 参数obj - 需要复制的对象。 memo - 可选参数,用于记录已经复制的对象,避免递归循环。
  • 返回值:返回obj的深拷贝。

示例

import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a)  # 深层复制
b[0] = 99
b[2][0] = 88
print(a)  # 输出: [1, 2, [3, 4]]
print(b)  # 输出: [99, 2, [88, 4]]

注意事项

  • 深层复制会递归地复制所有子对象,因此可能会过多复制数据。
  • 深层复制可以处理递归对象,避免递归循环。

4. 自定义复制操作

定义与原理

  • 类可以通过定义__copy__()__deepcopy__()方法来自定义复制操作。

函数原型

object.__copy__(self)
object.__deepcopy__(self, memo)
  • 参数self - 类的实例。 memo - 用于记录已经复制的对象,避免递归循环。
  • 返回值:返回复制后的对象。

示例

import copy

class MyClass:
    def __init__(self, value):
        self.value = value

    def __copy__(self):
        new_instance = MyClass(self.value)
        return new_instance

    def __deepcopy__(self, memo):
        import copy
        new_instance = MyClass(copy.deepcopy(self.value, memo))
        return new_instance

a = MyClass([1, 2, 3])
b = copy.copy(a)
c = copy.deepcopy(a)
b.value[0] = 99
c.value[0] = 88
print(a.value)  # 输出: [99, 2, 3]
print(b.value)  # 输出: [99, 2, 3]
print(c.value)  # 输出: [88, 2, 3]

注意事项

  • __copy__()方法不需要额外参数。
  • __deepcopy__()方法需要传入memo字典,用于记录已经复制的对象。

三、知识导图


四、应用案例

案例1:浅层复制与深层复制的区别

import copy

# 原始对象
original = [1, 2, [3, 4]]

# 浅层复制
shallow_copy = copy.copy(original)
shallow_copy[0] = 99
shallow_copy[2][0] = 88

# 深层复制
deep_copy = copy.deepcopy(original)
deep_copy[0] = 77
deep_copy[2][0] = 66

print("Original:", original)
print("Shallow Copy:", shallow_copy)
print("Deep Copy:", deep_copy)

案例2:自定义复制操作

import copy

class Person:
    def __init__(self, name, friends):
        self.name = name
        self.friends = friends

    def __copy__(self):
        new_instance = Person(self.name, self.friends)
        return new_instance

    def __deepcopy__(self, memo):
        import copy
        new_instance = Person(self.name, copy.deepcopy(self.friends, memo))
        return new_instance

# 原始对象
alice = Person("Alice", ["Bob", "Charlie"])

# 浅层复制
alice_shallow = copy.copy(alice)
alice_shallow.friends[0] = "David"

# 深层复制
alice_deep = copy.deepcopy(alice)
alice_deep.friends[0] = "Eve"

print("Original Friends:", alice.friends)
print("Shallow Copy Friends:", alice_shallow.friends)
print("Deep Copy Friends:", alice_deep.friends)

五、总结

学习路线

  1. 理解赋值与复制的区别。
  2. 掌握浅层复制和深层复制的概念及使用方法。
  3. 学习如何自定义复制操作。
  4. 通过实际案例加深理解。

学习总结

  • 赋值:创建新的变量绑定到同一个对象。
  • 浅层复制:复制对象本身,但不复制子对象。
  • 深层复制:复制对象及其所有子对象。
  • 自定义复制操作:通过定义__copy__()__deepcopy__()方法实现。

通过本文的学习,我们可以掌握Python中copy模块的使用方法,并能够在实际项目中灵活应用。


参考文献

  • Python官方文档: (https://docs.python.org/zh-cn/3/library/copy.html)
  • Python官方文档: (https://docs.python.org/zh-cn/3/library/pickle.html)

持续更新Python编程学习日志与技巧,敬请关注!


#编程# #学习# #在头条记录我的2025# #python#


Tags:

最近发表
标签列表