列表List和字典Dictionary是在使用Python时重要且非常高效的数据类型。
但是,在需要复制这两类数据时,不同的复制方法,产生的结果也不一样。
先以dict为例,list的说明在下方。
1,用直接用“=”进行复制
以dict为例,创建一个dict1,将dict1直接赋值给dict2,
>>> dict1 = {"a":1,"b":2,"c":3,"d":4}
>>> dict2 = dict1
>>> dict1
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
>>> dict2
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
那么当对dict1进行操作时,dict2会发生什么?
>>> dict1.pop('a')
1
>>> dict1
{'c': 3, 'b': 2, 'd': 4}
>>>
其中对dict1进行了一项的删除,并没有对dict2进行操作,那么来看看dict2
>>> dict2
{'c': 3, 'b': 2, 'd': 4}
>>>
dict2的‘a'项也被删除了。
这是为什么?
因为在这里简单的用=赋值,其实只是指向一个对象,对其中一个进行操作,另一个也随之改变了。
如图所示:
2,dict使用copy()函数
接着,使用copy()将dict1拷贝给dict2。
>>> dict3 = dict1.copy()
>>> dict1
{'c': 3, 'b': 2, 'd': 4}
>>> dict3
{'c': 3, 'b': 2, 'd': 4}
>>>
对dict1进行操作,dict3就不会受到影响
>>> dict1.pop('c')
3
>>> dict1
{'b': 2, 'd': 4}
>>> dict2
{'b': 2, 'd': 4}
>>> dict3
{'c': 3, 'b': 2, 'd': 4}
>>>
采用copy()这种复制方式对其中一个进行操作并不会影响另一个,那是因为,它对复制的对象重新生成一个内存空间,dict1和dict3指向不同的两个内存空间。
>>> dict3.pop('b')
2
>>> dict1
{'b': 2, 'd': 4}
>>> dict2
{'b': 2, 'd': 4}
>>> dict3
{'c': 3, 'd': 4}
>>>
list的=赋值产生结果与dict类似,但是,List并没有copy()函数,所以在List中采用[:]来实现拷贝。
具体代码实现如下:
=复制:
>>> l1 = [1,2,3,4,5]
>>> l2 = l1
>>> l1
[1, 2, 3, 4, 5]
>>> l2
[1, 2, 3, 4, 5]
>>> l1.remove(3)
>>> l1
[1, 2, 4, 5]
>>> l2
[1, 2, 4, 5]
采用拷贝方式:
>>> l3 = l1[:]
>>> l1
[1, 2, 4, 5]
>>> l3
[1, 2, 4, 5]
>>> l3.remove(1)
>>> l1
[1, 2, 4, 5]
>>> l3
[2, 4, 5]
>>> l2
[1, 2, 4, 5]
>>>