Python中List的复制(直接复制、浅拷贝、深拷贝) | 您所在的位置:网站首页 › stringcopy怎么用 › Python中List的复制(直接复制、浅拷贝、深拷贝) |
直接赋值:
如果用 = 直接赋值,是非拷贝方法。 这两个列表是等价的,修改其中任何一个列表都会影响到另一个列表。 old = [1,[1,2,3],3] new = [] for i in range(len(old)): new.append(old[i]) new[0] = 3 new[1][0] = 3 ''' ----------------------- Before: [1, [1, 2, 3], 3] [1, [1, 2, 3], 3] After: [3, [3, 2, 3], 3] [3, [3, 2, 3], 3] ----------------------- ''' 浅拷贝: 1.copy()方法对于List来说,其第一层,是实现了深拷贝,但对于其内嵌套的List,仍然是浅拷贝。 因为嵌套的List保存的是地址,复制过去的时候是把地址复制过去了,嵌套的List在内存中指向的还是同一个。 old = [1,[1,2,3],3] new = old.copy() new[0] = 3 new[1][0] =3 ''' --------------------- Before: [1, [1, 2, 3], 3] [1, [1, 2, 3], 3] After: [1, [3, 2, 3], 3] [3, [3, 2, 3], 3] --------------------- ''' 2.使用列表生成式使用列表生成式产生新列表也是一个浅拷贝方法,只对第一层实现深拷贝。 old = [1,[1,2,3],3] new = [i for i in old] new[0] = 3 new[1][0] = 3 ''' ---------------------- Before [1, [1, 2, 3], 3] [1, [1, 2, 3], 3] After [1, [3, 2, 3], 3] [3, [3, 2, 3], 3] ---------------------- ''' 3.for循环遍历通过for循环遍历,将元素一个个添加到新列表中。这也是一个浅拷贝方法,只对第一层实现深拷贝。 old = [1,[1,2,3],3] new = [] for i in range(len(old)): new.append(old[i]) new[0] = 3 new[1][0] = 3 ''' ----------------------- Before: [1, [1, 2, 3], 3] [1, [1, 2, 3], 3] After: [1, [3, 2, 3], 3] [3, [3, 2, 3], 3] ----------------------- ''' 4.使用切片通过使用 [ : ] 切片,可以浅拷贝整个列表,同样的,只对第一层实现深拷贝。 old = [1,[1,2,3],3] new = old[:] new[0] = 3 new[1][0] = 3 ''' ------------------ Before: [1, [1, 2, 3], 3] [1, [1, 2, 3], 3] After: [1, [3, 2, 3], 3] [3, [3, 2, 3], 3] ------------------ '''深拷贝: 如果用deepcopy()方法,则无论多少层,无论怎样的形式,得到的新列表都是和原来无关的,这是最安全最清爽最有效的方法。 需要import copy import copy old = [1,[1,2,3],3] new = copy.deepcopy(old) new[0] = 3 new[1][0] = 3 ''' ----------------------- Before: [1, [1, 2, 3], 3] [1, [1, 2, 3], 3] After: [1, [1, 2, 3], 3] [3, [3, 2, 3], 3] ----------------------- '''
|
CopyRight 2018-2019 实验室设备网 版权所有 |