学习简单而使用的copy模块:http://www.jb51.net/article/64030.htm
copy模块中只有两个方法:copy.copy和copy.deepcopy,分别称之为浅拷贝和深拷贝,以澡堂子为例来解释。
import copy
1.copy.copy:
a=[1,2,3,['x','y']]
#a引用(租赁、使用)这个澡堂子的四个隔间(地址),其中【‘x’,‘y’】是一个包间,适合两个对象以上。
c=copy.copy(a)
#相当于c引用了这个澡堂的四个隔间(地址),假若有一天,这个澡堂被a扩建如下:
a.append(4)
a.insert(1,5)
>>>a=[1,5,2,3,['x','y'],4]
#但c并不会因此改变,因为c租赁的只是原来的四个隔间(即使隔间数目被a扩建或插入)
c=[1,2,3,['x','y']]
#但如果a改变和c共用的某个隔间,比如['x','y']
a[4].append('z')
>>>[1,5,2,3,['x','y','z'],4]
#因为c也使用这个隔间,所以当下次老板c过来视察自己租赁的隔间时,就有
c=[1,2,3,['x','y','z']]
看到没有,a的那个包间对于c也是改变了,但隔间即‘5’、‘4’对应的地址对c没有影响,对c影响的只是copy.copy发生时刻a租赁的澡堂的原貌(地址)。
2.copy.deepcopy
a=[1,2,3,['x','y']]
d=copy.deepcopy(a)
#这相当于d自己照着a澡堂此时的样子重新盖了一间澡堂,所以a所在的澡堂无论被拆还是如何都对d无影响,相当于另起高楼,财大气粗。
学习copy模块对理解“在赋值和引用时到底保存了值还是保持了地址”有帮助。
附加一句:c=a[:]只能针对基本类型(字符串、数字),如果a中包含子列表,无法实现产生新表的作用。