下面我来详细讲解类的浅拷贝和深拷贝的区别。
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
对象复制而来,二者是独立不相关的。
总结
浅拷贝与深拷贝的核心区别在于,前者只是拷贝了对象的引用,而后者则是真正地拷贝了对象本身。所以,如果要复制一个对象,并且该对象包含其他对象的引用,通常应该使用深拷贝。