通过Python内置的copy
模块,我们可以快速地进行序列复制。该模块提供了两种方法用于序列的复制,分别是浅拷贝和深拷贝。接下来将分别介绍这两种方法的使用方法。
浅拷贝
所谓浅拷贝,是指不拷贝被复制的序列中子序列的对象本身,而是仅复制对他们的引用。我们可以使用copy
模块中的copy()
方法来实现浅拷贝。
示例一
下面的例子演示了如何使用copy()
方法来进行浅拷贝:
import copy
list1 = [1, 2, 3]
list2 = copy.copy(list1)
print(list1)
print(list2)
输出:
[1, 2, 3]
[1, 2, 3]
可以看到,list1
和list2
指向了不同的内存地址,但它们的内容是相同的。
示例二
同时,浅拷贝也适用于嵌套序列的复制。我们来看下面这个例子:
import copy
list1 = [1, 2, [3, 4]]
list2 = copy.copy(list1)
list1[2][0] = 'Changed'
print(list1)
print(list2)
输出:
[1, 2, ['Changed', 4]]
[1, 2, ['Changed', 4]]
可以看出,虽然是通过浅拷贝生成的list2
,但其嵌套的子序列[3,4]
被更改后,list1
和list2
中的[3,4]
都发生了变化,因为它们共用同一个子序列对象。
深拷贝
深拷贝则会同时复制被复制序列中的子序列对象本身,而不仅仅只是引用。我们可以使用copy
模块中的deepcopy()
方法来实现深拷贝。
示例一
下面的例子演示了如何使用deepcopy()
方法来进行深拷贝:
import copy
list1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1)
list1[2][0] = 'Changed'
print(list1)
print(list2)
输出:
[1, 2, ['Changed', 4]]
[1, 2, [3, 4]]
可以看出,当使用深拷贝的时候,即使被复制序列中含有嵌套序列等引用类型的对象,被复制对象和复制对象之间也是完全独立的。
示例二
我们还可以通过deepcopy()
方法对自定义类的实例进行深拷贝。下面是一个例子:
import copy
class MyClass:
def __init__(self, num):
self.num = num
obj1 = MyClass(1)
obj2 = copy.deepcopy(obj1)
obj1.num = 2
print(obj1.num) # 输出:2
print(obj2.num) # 输出:1
可以看出,即使我们将对象obj1
的属性值改为2,通过深拷贝得到的obj2
的属性值依旧为1。
以上就是使用Python进行序列复制的一些技巧了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 如何快速复制序列 - Python技术站