一、赋值(Assignment)
赋值是指创建一个新的变量名,使其引用原始对象。换句话说,赋值操作只是创建了一个指向原对象的新引用,而不会创建新的对象。
original_list = [1, 2, 3]
new_list = original_list
new_list[0] = 5
print(original_list) # [5, 2, 3],原始列表被修改了
print(new_list) # [5, 2, 3]
new_list
被赋值为original_list
,它们引用了同一个列表对象,所以修改new_list
也会影响original_list
。
二、浅拷贝(Shallow Copy)
浅拷贝是指创建一个新对象,然后将原始对象中的元素复制到新对象中。但是,新旧对象中的元素引用相同的内存地址,即复制的是元素的引用而不是元素本身。
在 Python 中,可以使用copy()
方法或者切片操作来进行浅拷贝,浅拷贝适用于简单的数据结构。
import copy
original_list = [1, 4]
new_list = copy.copy(original_list)
new_list[1] = 5
print(original_list) # [1, 4]
print(new_list) # [1, 5]
但对于嵌套的结构,如果原始对象包含嵌套对象(如列表中的列表),则新旧对象中的嵌套对象引用相同的内存地址。
import copy
original_list = [1, [2, 3], 4]
shallow_copied_list = copy.copy(original_list)
shallow_copied_list[1][0] = 5
print(original_list) # [1, [5, 3], 4],原始列表被修改了
print(shallow_copied_list) # [1, [5, 3], 4]
shallow_copied_list
是通过浅拷贝创建的,但是它和original_list
共享内部嵌套列表的引用,所以修改嵌套列表会影响两个列表。
三、深拷贝(Deep Copy)
深拷贝是指创建一个新对象,并递归地复制原始对象中的所有嵌套对象及其内容,使得新对象和原始对象彼此独立,互不影响。
在 Python 中,可以使用 copy 模块的deepcopy()
函数来执行深拷贝操作。深拷贝适用于包含复杂嵌套结构的数据,确保各个嵌套层次的对象都是独立的。
import copy
original_list = [1, [2, 3], 4]
deep_copied_list = copy.deepcopy(original_list)
deep_copied_list[1][0] = 5
print(original_list) # [1, [2, 3], 4],原始列表未受影响
print(deep_copied_list) # [1, [5, 3], 4]
深拷贝创建了一个新的列表对象,包括内部嵌套列表也被完全复制,因此对
deep_copied_list
的修改不会影响original_list
。
四、总结
- 赋值是创建一个新的引用,两个引用指向同一个对象。
- 浅拷贝是创建一个新对象,但对于嵌套对象,新旧对象中的嵌套对象引用相同。
- 深拷贝是创建一个新对象,并递归地复制嵌套对象,确保新对象和原始对象相互独立。
选择使用浅拷贝还是深拷贝取决于需求和数据结构的复杂性。对于嵌套层次很深的结构,深拷贝可能会消耗更多的内存和性能,所以要根据实际情况做出选择。
记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~