详解Python中深浅拷贝的使用及注意事项
什么是深拷贝和浅拷贝?
在Python中,拷贝是指创建一个新的对象,使其与原始对象的值相同,但在内存中有一个不同的地址。拷贝分为浅拷贝和深拷贝两种。
- 浅拷贝(shallow copy)创建一个新的对象,但该新对象仅是原始对象的一个引用。因此,如果原始对象中的嵌套对象更改了,则浅拷贝对象中的嵌套对象也将更改。
- 深拷贝(deep copy)创建一个新的对象,其中包含原始对象及其所有嵌套对象的副本。因此,如果原始对象中的嵌套对象更改了,则深拷贝对象中的嵌套对象不会更改。
浅拷贝的示例
下面是一个使用浅拷贝的示例:
import copy
original_list = [1, 2, [3, 4]]
shallow_copy_list = copy.copy(original_list)
print("Original list: ", original_list)
print("Shallow copy list: ", shallow_copy_list)
shallow_copy_list[2][0] = 10
print("Original list: ", original_list)
print("Shallow copy list: ", shallow_copy_list)
输出如下:
Original list: [1, 2, [3, 4]]
Shallow copy list: [1, 2, [3, 4]]
Original list: [1, 2, [10, 4]]
Shallow copy list: [1, 2, [10, 4]]
可以看出,对浅拷贝列表的更改也更改了原始列表中的嵌套列表中的元素。这是因为浅拷贝对象仅是原始对象的一个引用。
深拷贝的示例
下面是一个使用深拷贝的示例:
import copy
original_list = [1, 2, [3, 4]]
deep_copy_list = copy.deepcopy(original_list)
print("Original list: ", original_list)
print("Deep copy list: ", deep_copy_list)
deep_copy_list[2][0] = 10
print("Original list: ", original_list)
print("Deep copy list: ", deep_copy_list)
输出如下:
Original list: [1, 2, [3, 4]]
Deep copy list: [1, 2, [3, 4]]
Original list: [1, 2, [3, 4]]
Deep copy list: [1, 2, [10, 4]]
可以看出,对深拷贝列表的更改没有更改原始列表中嵌套列表中的元素。这是因为深拷贝对象是原始对象及其所有嵌套对象的副本。
注意事项
- 如果原始对象不是可变对象,例如数字、字符串或元组,则在浅拷贝和深拷贝之间没有区别。
- 深拷贝对象可能会很慢并且占用大量内存,因为它们需要复制所有嵌套对象。
- 拥有循环引用的对象无法进行深拷贝,因为会无限循环。
以上就是Python中深浅拷贝的使用及注意事项的攻略。