详解类的浅拷贝和深拷贝的区别

  • Post category:Python

下面我来详细讲解类的浅拷贝和深拷贝的区别。

1. 浅拷贝与深拷贝概述

在面向对象编程中,对象的拷贝是一种常见操作。拷贝分为浅拷贝和深拷贝两种。二者的核心区别是前者只是拷贝了对象的引用,而后者则是真正地拷贝了对象本身。下面分别介绍一下二者的定义及其示例。

2. 浅拷贝示例

浅拷贝就是把一个对象的引用复制给另一个新的对象,这两个对象指向的是同一块内存。所以,对其中一个对象做修改操作,另一个对象也会跟着改变。示例如下:

class Person:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_info(self):
        print("My name is {0}, and I am {1} years old.".format(self.name, self.age))


p1 = Person("Tom", 25)
p2 = p1  # 浅拷贝

p1.get_info()  # 输出:My name is Tom, and I am 25 years old.
p2.get_info()  # 输出:My name is Tom, and I am 25 years old.

p2.age = 30

p1.get_info()  # 输出:My name is Tom, and I am 30 years old.
p2.get_info()  # 输出:My name is Tom, and I am 30 years old.

可以看到,对 p2 对象的修改会影响到 p1 对象,这是因为 p2 对象只是 p1 对象的引用。

3. 深拷贝示例

深拷贝则是把一个对象的属性值等数据都复制给一个新的对象,这两个对象指向的是不同的内存空间。所以,对其中一个对象做修改操作,另一个对象不会受到影响。示例如下:

import copy

class Person:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_info(self):
        print("My name is {0}, and I am {1} years old.".format(self.name, self.age))


p1 = Person("Tom", 25)
p2 = copy.deepcopy(p1)  # 深拷贝

p1.get_info()  # 输出:My name is Tom, and I am 25 years old.
p2.get_info()  # 输出:My name is Tom, and I am 25 years old.

p2.age = 30

p1.get_info()  # 输出:My name is Tom, and I am 25 years old.
p2.get_info()  # 输出:My name is Tom, and I am 30 years old.

可以看到,对 p2 对象的修改不会影响到 p1 对象,这是因为 p2 对象完全是由 p1 对象复制而来,二者是独立不相关的。

总结

浅拷贝与深拷贝的核心区别在于,前者只是拷贝了对象的引用,而后者则是真正地拷贝了对象本身。所以,如果要复制一个对象,并且该对象包含其他对象的引用,通常应该使用深拷贝。