详解Python中深浅拷贝的使用及注意事项
什么是深浅拷贝?
在Python中,拷贝是指将一个变量赋值给另一变量,以便于两个变量在内存中是不同的,但是它们的值相同。
深拷贝是指拷贝一个对象的副本,不管这个对象有多少个嵌套的对象(例如,一个 list 中还包含另一个 list),所有嵌套的对象都会被拷贝到新的对象中。
浅拷贝是指拷贝一个对象的引用,如果这个对象有嵌套的对象,就不会被拷贝到新的对象中,而只是被引用。
如何进行深浅拷贝?
Python中深浅拷贝有两种方法,一种是通过模块函数进行拷贝,另外一种是通过对象的方法进行拷贝。
使用模块函数进行拷贝
- 浅拷贝
使用copy模块函数进行浅拷贝,可以使用以下代码实现:
import copy
lst = [1, [2, 3], 4]
lst_copy = copy.copy(lst)
# 改变lst中嵌套的列表中的值
lst[1][0] = 0
print(lst) # [1, [0, 3], 4]
print(lst_copy) # [1, [0, 3], 4]
通过运行上述代码可以看到,lst_copy 只是一个lst的浅拷贝,那么当lst中嵌套的列表中的值改变时,lst_copy的嵌套列表中的值也会改变。
- 深拷贝
使用copy模块函数进行深拷贝,可以使用以下代码实现:
import copy
lst = [1, [2, 3], 4]
lst_copy = copy.deepcopy(lst)
# 改变lst中嵌套的列表中的值
lst[1][0] = 0
print(lst) # [1, [0, 3], 4]
print(lst_copy) # [1, [2, 3], 4]
通过运行上述代码可以看到,lst_copy 是 lst 的深拷贝,随着lst中嵌套的列表中的值改变,lst_copy的值并不会改变。
使用对象的方法进行拷贝
对于列表和字典,还可以使用对象的方法进行拷贝。
- 浅拷贝
列表中的浅拷贝可以使用以下代码实现:
lst = [1, [2, 3], 4]
lst_copy = lst.copy()
# 改变lst中嵌套的列表中的值
lst[1][0] = 0
print(lst) # [1, [0, 3], 4]
print(lst_copy) # [1, [0, 3], 4]
通过运行上述代码可以看到,lst_copy也是lst的浅拷贝,当lst中嵌套的列表中的值改变时,lst_copy的嵌套列表中的值也会改变。
- 深拷贝
列表中的深拷贝可以使用以下代码实现:
import copy
lst = [1, [2, 3], 4]
lst_copy = lst.__class__(copy.deepcopy(i) for i in lst)
# 改变lst中嵌套的列表中的值
lst[1][0] = 0
print(lst) # [1, [0, 3], 4]
print(lst_copy) # [1, [2, 3], 4]
通过运行上述代码可以看到,lst_copy 是 lst 的深拷贝,随着lst中嵌套的列表中的值改变,lst_copy的值并不会改变。
注意事项
- 拷贝的值可以是任意的Python对象,包括列表、字典、元组等;
- 浅拷贝只是复制了最外层的对象,而嵌套在其中的对象不会一起被复制,仍然指向原对象;
- 深拷贝则会将嵌套的对象都复制一遍;
- 如果使用深拷贝会消耗较多的时间和内存,因此应该谨慎使用。
示例说明
实例一
简单的深浅拷贝使用示例。
import copy
lst = [1, [2, 3], 4]
lst_copy = lst.copy()
lst_copy[0] = 5
lst_copy[1][0] = 6
print(lst) # [1, [6, 3], 4]
print(lst_copy) # [5, [6, 3], 4]
通过运行上述代码可以看到,lst_copy是lst的浅拷贝,当lst_copy中的值改变时,lst中嵌套列表的值也会改变。
实例二
使用字典进行深浅拷贝使用示例。
import copy
dic = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}}
dic_copy = copy.deepcopy(dic)
dic_copy['a'] = 5
dic_copy['c']['d'] = 6
print(dic) # {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}}
print(dic_copy) # {'a': 5, 'b': 2, 'c': {'d': 6, 'e': 4}}
通过运行上述代码可以看到,dic_copy是dic的深拷贝,当dic_copy中的值改变时,dic中嵌套字典的值也会改变。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python中深浅拷贝的使用及注意事项 - Python技术站