python基础之列表深浅复制的问题

  在python中我们对一个列表的复制最常用的方法就是将该列表直接赋值给另一个变量,而实际上对象赋值实际上是对象的引用,python并没有完全复制这个对象,而只是复制了这个对象的引用。因此当原始的列表数据发生改变时,被赋值的列表也会改变,例如:

names = ['Kobe','James','Jordan','Curry',['Green','Durnt']]
names01 = names
print(names)        #打印结果:['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Durnt']]
print(names01)      #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Durnt']]

names[4][1]= 'Paul'
print(names)        #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Paul']]
print(names01)      #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Paul']]

  其实python列表的操作中自带了一个关于复制的方法,使用方法如:names02 = names.copy(),又称浅复制,拷贝父对象,浅复制并没有拷贝子对象,所以原始数据改变,对父对象进行操作时新列表不变,但对子对象操作时新的列表会改变,例如:

names02 = names.copy()
print(names)        #打印结果:['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Durnt']]
print(names02)      #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Durnt']]

#对父对象进行操作
names[0] = 'KD'
print(names)        #['KD', 'James', 'Jordan', 'Curry', ['Green', 'Paul']]
print(names02)      #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Paul']]

#对子对象进行操作
names[4][1] = 'TT'
print(names)        #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'TT']]
print(names02)      #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'TT']]

  为了解决出现的这种原始数据改变却能影响新的列表数据的情况,深复制完美解决了这个问题。深复制是copy模块的 deepcopy方法,完全拷贝了父对象及其子对象,所以无论原始对象的改变不会造成深拷贝里任何子元素的改变,举例情况如下:

import copy
names03 = copy.deepcopy(names)
print(names)        #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Durnt']]
print(names03)      #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Durnt']]

#改变父对象操作
names[0] = 'KD'
print(names)        #['KD', 'James', 'Jordan', 'Curry', ['Green', 'Durnt']]
print(names03)      #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Durnt']]

#改变子对象操作
names[4][1] = 'TT'
print(names)        #['KD', 'James', 'Jordan', 'Curry', ['Green', 'TT']]
print(names03)      #['Kobe', 'James', 'Jordan', 'Curry', ['Green', 'Durnt']]