序言
那时 给他们导出Python常用丘托韦:Python统计数据中的厚薄复本。
在Python中,有时候他们须要拷贝两个第一类,以期在不出现改变原初第一类的情况下展开操作方式。Python提供更多了三种拷贝第一类的方式:浅复本和深复本。责任编辑将详尽如是说这三种方式,和它的差别和采用情景。
1. 浅复本
浅复本是指建立两个新第一类,但那个新第一类而已原初第一类的两个提及。换句话说,在新第一类中,原初第一类中的大部份原素都而已提及。假如原初对象中的原素出现了变动,所以新第一类中的原素也会出现出现改变。
1.1 采用方式
在Python中,能采用copy()方式来展开浅复本。比如:
list1 = [1, 2, [3, 4]] list2= list1.copy()下面的标识符建立了两个包涵两个有理数和两个条目的条目,并采用copy()方式将其浅复本到了另两个表达式中。
1.2 实例
下面的实例模拟了浅复本的组织工作基本原理:
list1 = [1, 2, [3, 4]] list2 = list1.copy() print(“list1:”, list1) print(“list2:”, list2) list1[2][0] = 5 print(“list1:”, list1) print(“list2:”, list2)输入结论为:
list1: [1, 2, [3, 4]] list2: [1, 2, [3, 4]] list1: [1, 2, [5, 4]] list2: [1, 2, [5, 4]]能看到,当他们修改原初条目中的嵌套条目时,新条目中的相应原素也被修改了。
2. 深复本
深复本是指建立两个新第一类,并且那个新第一类与原初第一类没有任何关联。换句话说,在新第一类中,原初第一类中的大部份原素都被复制到了新的内存地址中。假如原初第一类中的原素出现了变动,所以新第一类中的原素不会受到影响。
2.1 采用方式
在Python中,能采用deepcopy()方式来展开深复本。比如:
import copy list1 = [1, 2, [3, 4]] list2 = copy.deepcopy(list1)下面的标识符建立了两个包涵两个有理数和两个条目的条目,并采用deepcopy()方式将其深复本到了另两个表达式中。
2.2 实例
下面的实例模拟了深复本的组织工作基本原理:
import copy list1 = [1, 2, [3, 4]] list2 = copy.deepcopy(list1)print(“list1:”, list1) print(“list2:”, list2) list1[2][0] = 5 print(“list1:”, list1)print(“list2:”, list2)输入结论为:
list1: [1, 2, [3, 4]] list2: [1, 2, [3, 4]] list1: [1, 2, [5, 4]] list2: [1, 2, [3, 4]]能看到,当他们修改原初条目中的嵌套条目时,新条目中的相应原素没有被修改。
3. 总结
浅复本和深复本是Python中三种常用的拷贝第一类的方式。
浅复本建立两个新第一类,但那个新第一类而已原初第一类的两个提及;而深拷贝建立两个新第一类,并且那个新第一类与原初第一类没有任何关联。在实际开发中,他们须要根据具体的情况选择采用哪种方式。
假如他们须要拷贝的第一类只包涵基本统计数据类型,所以采用浅复本就足够了。但,假如他们须要拷贝的第一类包涵嵌套的第一类,所以就须要采用深复本。因为浅复本而已拷贝了提及,而深复本则会递归地拷贝整个第一类树。
除了copy()和deepcopy()方式外,Python还提供更多了其他一些拷贝第一类的方式,如slice操作方式符、list()构造函数等。这些方式也能用于拷贝第一类,但它都只能展开浅复本,不能展开深复本。
在采用深复本时,须要注意以下几点:
深复本可能会比较耗时,因为它须要递归地拷贝整个第一类树。深复本可能会导致循环提及的问题。假如被拷贝的第一类中存在循环提及,所以深复本会进入死循环,直到Python的最大递归深度被达到为止。深复本可能会导致内存占用过高的问题。假如被拷贝的第一类非常大,所以深复本会占用大量的内存。综上所述,厚薄复本是Python中非常重要的概念,对于认知Python中的内存管理和第一类模型非常有帮助。在实际开发中,他们须要根据具体的情况选择采用哪种方式,并且须要注意深复本可能带来的性能和内存问题。
扩展
除了深复本和浅复本之外,Python还提供更多了一些其他的第一类拷贝方式。下面如是说其中的几种方式。
slice操作方式符能用于拷贝条目、元组、字符串等序列类型的第一类。比如:
a= [1, 2, 3, 4] b = a[:]这里,b就是a的两个浅复本,它包涵了a中大部份原素的副本。由于slice操作方式符只展开浅复本,因此假如a中包涵了嵌套的第一类,所以b中的这些第一类仍然是a中的提及。
2. list()构造函数
list()构造函数能用于将其他序列类型的第一类转换为条目,并且能实现浅复本。比如:
a = (1, 2, 3, 4) b = list(a)这里,b就是a的两个浅复本,它包涵了a中大部份原素的副本。
另外,须要注意的是,Python中的一些内置类型,如int、str、tuple等是不可变类型,它没有提供更多修改自身内容的方式。因此,对这些类型展开浅复本和深复本是没有任何差别的。比如:
a = 123 b= copy.copy(a)c = copy.deepcopy(a)这里,b和c都是a的副本,它的值都是123。
最后,须要注意的是,在Python中,第一类的拷贝和第一类的赋值是不同的概念。第一类的赋值而已将两个表达式名与两个第一类关联起来,而不是拷贝第一类本身。比如:
a = [1, 2, 3] b = a这里,b而已a的两个别名,它实际上指向同两个第一类。因此,对a或b展开修改,都会影响到另两个表达式。假如须要拷贝a的副本,能采用a.copy()或者copy模块中的函数。