c语言编程笔录

首页 >   > 笔记大全

笔记大全

python中深copypython深入

更新时间:2023-12-04

Python深copy和浅copy的区别

Python中的浅copy指的是复制对象中的引用,而不是值本身。深copy则是在内存中创建一个全新的对象并复制值,不与原对象共享任何引用。下面是一个例子来说明它们之间的区别。


#浅copy示例
a = [[1,2],[3,4]]
b = a.copy()

print(a)
print(b)

a[0][0] = 0

print(a)
print(b)

#深copy示例
import copy

a = [[1,2],[3,4]]
b = copy.deepcopy(a)

print(a)
print(b)

a[0][0] = 0

print(a)
print(b)

上述例子中,浅copy的结果会与原对象共享内部列表的引用,因此改变一个列表的值也会影响另一个列表。而深copy则会在内存中创建一个全新的对象,两个对象之间不会共享任何引用。

Python中深copy的使用方法

在Python中,我们可以使用copy模块中的deepcopy()函数来实现深copy操作。下面是一个使用深copy的例子。


import copy

a = [[1,2],[3,4]]
b = copy.deepcopy(a)

print(a)
print(b)

a[0][0] = 0

print(a)
print(b)

上述例子中,我们使用copy模块中的deepcopy()函数来实现深copy操作,将a的值复制给b。此时改变a中的值不会影响b的值。

深copy的性能问题

尽管深copy操作会创建一个全新的对象,但它会在复制大型嵌套对象时导致性能问题。这是因为深copy操作需要遍历整个对象层次结构,将对象的每个值都复制一遍。


import copy
import time

a = [[1,2],[3,4]]

start_time = time.time()

for i in range(100000):
    b = copy.deepcopy(a)

print('Time taken with deepcopy:', time.time()-start_time)

start_time = time.time()

for i in range(100000):
    b = copy.copy(a)

print('Time taken with copy:', time.time()-start_time)

上述例子中,我们比较了深copy和浅copy操作在复制一个100000次迭代的列表时所需的时间,结果深copy的速度比浅copy要慢得多。

实例——使用深copy解决循环引用问题

循环引用是指嵌套对象中一个对象引用了父对象。在这种情况下,使用浅copy和深copy都可能会导致无限递归的问题。使用深copy可以方便地解决这个问题。


import copy

class Node:
    def __init__(self, val):
        self.val = val
        self.next = None

    def add_next(self, node):
        self.next = node

a = Node(1)
b = Node(2)
c = Node(3)

a.add_next(b)
b.add_next(c)
c.add_next(a)

d = copy.deepcopy(a)

print(d.next.next.val)

上述例子中,我们创建了一个三个节点的循环链表,使用深copy复制对象时,复制会停止在第三个节点,不会无限递归地复制。