浅拷贝copy()和深拷贝deepcopy()

发布时间 2023-04-16 01:54:32作者: solomon-zj

一、拷贝

在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表和字典,你可能不希望这些变量影响原来的列表或字典。python提供了名为copy的模块,其中包含了copy()和deepcopy()函数。

  • copy.copy()
>>> import copy
>>> spam = ["a","b","c","d"]
>>> cheese = copy.copy(spam)
>>> cheese[1]=42
>>> spam
['a', 'b', 'c', 'd']
>>> cheese
['a', 42, 'c', 'd']

通过copy()函数,将spam和cheese变量指向独立的列表。

  • copy.deepcopy()
>>> import copy
>>> List1 = ['1', '2', 3, 'a', ['b', 'c']]
>>> List2 = List1        # 将List1赋给List2,相当于list2与list1指向同一块地址空间,list1里面内容发生,list2内容也会跟着发生改变
>>> List3 = copy.copy(List1)       # 浅拷贝,只拷贝深拷贝的第一层(父对象)
>>> List4 = copy.deepcopy(List1)   # 深拷贝,从上到底全部对象内容拷贝
>>> List1.append('test')     # 在List1末尾添加'test'
>>> List1[4].append('d')     # 在List1中['b','c']的末尾添加'd'
>>> print('List1:%s' % List1)
List1:['1', '2', 3, 'a', ['b', 'c', 'd'], 'test']
>>> print('List2:%s' % List2)
List2:['1', '2', 3, 'a', ['b', 'c', 'd'], 'test']
>>> print('List3:%s' % List3)
List3:['1', '2', 3, 'a', ['b', 'c', 'd']]
>>> print('List4:%s' % List4)
List4:['1', '2', 3, 'a', ['b', 'c']]

Tips:

如果要复制的列表中包含了列表,那就使用copy.deepcopy()函数来代替。