实现深拷贝
时间: 2023-07-08 12:08:26 浏览: 37
深拷贝是指在拷贝对象时,将原对象的所有属性都复制一份到新对象中,而不是只复制引用。这样新对象和原对象就可以独立存在,互不影响。
实现深拷贝的方法有多种,以下是其中两种:
1. 递归拷贝
递归拷贝是指对于对象的每一个属性,如果它是一个对象,那么就递归地对这个对象进行拷贝。如果是基本类型,则直接将它复制到新对象中。以下是一个示例:
```python
import copy
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class Company:
def __init__(self, name, ceo, employees):
self.name = name
self.ceo = ceo
self.employees = employees
person1 = Person('Tom', 30)
person2 = Person('Jerry', 25)
company1 = Company('ABC', person1, [person1, person2])
# 使用递归拷贝实现深拷贝
company2 = copy.deepcopy(company1)
# 修改原对象的值不会影响新对象
person1.name = 'Jim'
print(company1.ceo.name) # 输出:Tom
print(company2.ceo.name) # 输出:Tom
```
2. 使用序列化和反序列化
序列化和反序列化是指将一个对象转换为一个字符串,然后再将这个字符串转换回对象。这种方法需要对象支持序列化和反序列化。以下是一个示例:
```python
import pickle
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class Company:
def __init__(self, name, ceo, employees):
self.name = name
self.ceo = ceo
self.employees = employees
person1 = Person('Tom', 30)
person2 = Person('Jerry', 25)
company1 = Company('ABC', person1, [person1, person2])
# 使用序列化和反序列化实现深拷贝
company2 = pickle.loads(pickle.dumps(company1))
# 修改原对象的值不会影响新对象
person1.name = 'Jim'
print(company1.ceo.name) # 输出:Jim
print(company2.ceo.name) # 输出:Tom
```
需要注意的是,使用序列化和反序列化实现深拷贝的对象必须支持序列化和反序列化,否则会报错。