赋值、浅拷贝和深拷贝是 Python 中用于创建对象副本的不同方式。它们之间的区别在于复制的程度和对原始对象和副本的影响。
- 赋值(Assignment):通过将一个对象的引用赋值给另一个变量,使这两个变量都指向同一个内存地址。赋值只是创建了一个指向原始对象的新引用,而没有创建新的对象。因此,在使用赋值操作时,如果修改其中一个变量所指向的对象,另一个变量也会反映出修改后的值。这是因为它们共享相同的内存地址。示例代码如下:
import copy original_list = [1, 2, 3] new_list = original_list # 赋值操作 new_list.append(4) print(original_list) # 输出:[1, 2, 3, 4]
- 浅拷贝(Shallow Copy):浅拷贝创建了一个新的对象,但该对象只是原始对象的表面拷贝,其中包含的元素仍然是原始对象元素的引用。当我们进行浅拷贝时,只有最外层的数据结构被复制,而嵌套的对象则是共享的。因此,在修改浅拷贝的对象时,原始对象中的嵌套对象也会受到影响。可以使用
copy()
函数或切片操作来进行浅拷贝。示例代码如下:
import copy
original_list = [1, 2, [3, 4]]
new_list = copy.copy(original_list) # 浅拷贝操作
new_list[2].append(5)
print(original_list) # 输出:[1, 2, [3, 4, 5]]
- 深拷贝(Deep Copy):深拷贝创建了一个全新的对象,包括原始对象及其嵌套对象的副本。完全独立于原始对象,即使对副本进行修改,原始对象也不会受到影响。可以使用
copy.deepcopy()
函数来进行深拷贝。示例代码如下:
import copy
original_list = [1, 2, [3, 4]]
new_list = copy.deepcopy(original_list) # 深拷贝操作
new_list[2].append(5)
print(original_list) # 输出:[1, 2, [3, 4]]
总结起来,赋值只是创建了一个引用,指向同一内存地址的对象;浅拷贝创建了一个新对象,但其中的元素仍然是原始对象的引用;而深拷贝则是创建了一个全新的对象,包括原始对象及其嵌套对象的副本,彼此互不影响。根据对原始对象和副本之间关系的需要,选择适当的复制方式。