详解Python中深浅拷贝的使用及注意事项

  • Post category:Python

详解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中深浅拷贝的使用及注意事项的攻略。