Python中的对象之间赋值时是按引用传递的,以列表为例:
列表中的元素通过下标索引与内存对象一一对应。
浅拷贝
当我们用”=”复制一列表时,并修改某一个值时会出现原列表值也被修改:
>>>l = ['A', 'B', 'C', 'D']
>>>l2 = l
>>>l2
['A', 'B', 'C', 'D']
>>>l2[1] = 'Z'
>>>l
['A', 'Z', 'C', 'D'] #修改的是l2的值,但是l中的值也被修改
这是因为,用l2 = l 时,只是传递了引用,l和l2之间是共享引用的,这种拷贝叫浅拷贝。
当我们修改l2的值时,列表l因为和l2共享同一下标,所以也就发生了改变:
如果我们只是简单的想要复制一个一模一样的变量,并且避免发生共享引用,可以使用序列的copy方法或者l2 = l[:]
>>>l = ['A', 'B', 'C', 'D']
>>>l2 = l.copy()
>>>l2
['A', 'B', 'C', 'D']
>>>l2[1] = 'Z'
>>>l
['A', 'B', 'C', 'D']
>>>l2
['A', 'Z', 'C', 'D']
>>>l3 = l[:]
>>>l3[2] = 'Q'
>>>l3
['A', 'B', 'Q', 'D']
>>>l
['A', 'B', 'C', 'D']
深拷贝
这两种方法都能够完全复制一维列表的下标和内存对象,但是!再遇到多维列表时又会出现问题
>>>l = [[1, 2], 'A', 'B', 'C', 'D']
>>>l2 = l.copy()
>>>l2[0][1] = 0
>>>l
[[1, 0], 'A', 'B', 'C', 'D']
由此可见这两种方法只能完全复制一维列表,在复制二维列表时同样只是复制了引用,对于这种情况,可以使用copy模块下的deepcopy()方法
>>>import copy
>>>l = [[1, 2], 'A', 'B', 'C', 'D']
>>>l2 = copy.deepcopy(l)
>>>l2[0][1] = 0
>>>l2
[[1, 0], 'A', 'B', 'C', 'D']
>>>l
[[1, 2], 'A', 'B', 'C', 'D'] #l2的值改变时,l的值没有发生改变
#再来测试一下三维列表
>>>l = [[[1,2], 3, 4], 5, 6]
>>>l2 = copy.deepcopy(l)
>>>l2[0][0][1] = 0
>>>l2
[[[1, 0], 3, 4], 5, 6]
>>>l
[[[1, 2], 3, 4], 5, 6] #同样l2的值改变时,l的值没有发生改变
小结
- 以上是自己学python时的一些笔记,感觉写在本上不方便,正好利用闲暇时间腾到csdn上。
- 自己的总结,如果有那些地方不合理或有有误,请指正。
- 知识体系图:[Python3基础