浅析深拷贝与浅拷贝以及写时拷贝

原创
ithorizon 6个月前 (10-15) 阅读数 29 #Linux

浅析深拷贝与浅拷贝以及写时拷贝

在编程中,我们经常性需要对对象进行复制操作,以实现数据共享或保存原始数据的状态。在这个过程中,我们会遇到浅拷贝和深拷贝的概念。此外,写时拷贝(Write-Through Copy)也是一种常用的复制策略。本文将详细介绍这三种拷贝方法,并分析它们的优缺点。

1. 浅拷贝与深拷贝

浅拷贝和深拷贝是两种常见的对象复制方法,它们的首要区别在于复制过程中是否递归复制对象的所有属性。

1.1 浅拷贝

浅拷贝是指复制对象时,仅复制对象本身,而不复制对象所包含的属性。在浅拷贝中,如果对象属性是基本数据类型,则直接复制值;如果属性是引用类型,则复制引用地址。

以下是一个浅拷贝的示例代码:

python

class Person:

def __init__(self, name, age, address):

self.name = name

self.age = age

self.address = address

# 创建一个对象

person1 = Person('Alice', 25, ['Beijing', 'Shanghai'])

# 进行浅拷贝

person2 = person1.copy()

# 修改person1的属性

person1.age = 30

person1.address.append('Guangzhou')

# 输出person1和person2的属性

print('person1 age:', person1.age)

print('person2 age:', person2.age)

print('person1 address:', person1.address)

print('person2 address:', person2.address)

输出因此为:

person1 age: 30

person2 age: 25

person1 address: ['Beijing', 'Shanghai', 'Guangzhou']

person2 address: ['Beijing', 'Shanghai']

从输出因此可以看出,浅拷贝只复制了对象本身,而对象所包含的属性并未复制。由此,修改原对象属性时,拷贝对象也会受到影响。

1.2 深拷贝

深拷贝是指复制对象时,递归复制对象本身及其所有属性。在深拷贝中,如果属性是基本数据类型,则直接复制值;如果属性是引用类型,则递归复制引用地址所指向的对象。

以下是一个深拷贝的示例代码:

python

import copy

class Person:

def __init__(self, name, age, address):

self.name = name

self.age = age

self.address = address

# 创建一个对象

person1 = Person('Alice', 25, ['Beijing', 'Shanghai'])

# 进行深拷贝

person2 = copy.deepcopy(person1)

# 修改person1的属性

person1.age = 30

person1.address.append('Guangzhou')

# 输出person1和person2的属性

print('person1 age:', person1.age)

print('person2 age:', person2.age)

print('person1 address:', person1.address)

print('person2 address:', person2.address)

输出因此为:

person1 age: 30

person2 age: 25

person1 address: ['Beijing', 'Shanghai', 'Guangzhou']

person2 address: ['Beijing', 'Shanghai']

从输出因此可以看出,深拷贝复制了对象本身及其所有属性。由此,修改原对象属性时,拷贝对象不会受到影响。

2. 写时拷贝

写时拷贝(Write-Through Copy)是一种特殊的拷贝方法,它在对象被修改时才进行复制。这种策略可以缩减不必要的复制操作,减成本时间性能。

以下是一个写时拷贝的示例代码:

python

class Person:

def __init__(self, name, age, address):

self.name = name

self.age = age

self.address = address

def __copy__(self):

return Person(self.name, self.age, self.address.copy())

# 创建一个对象

person1 = Person('Alice', 25, ['Beijing', 'Shanghai'])

# 进行写时拷贝

person2 = copy.copy(person1)

# 修改person1的属性

person1.age = 30

person1.address.append('Guangzhou')

# 输出person1和person2的属性

print('person1 age:', person1.age)

print('person2 age:', person2.age)

print('person1 address:', person1.address)

print('person2 address:', person2.address)

输出因此为:

person1 age: 30

person2 age: 25

person1 address: ['Beijing', 'Shanghai', 'Gu

本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: Linux


热门