有勇气的牛排博客

Python中深拷贝、浅拷贝与等号的区别

有勇气的牛排 472 Python 2024-09-19 18:00:53

区别

浅拷贝:只复制对象本身,对象中的引用类型保持共享欢喜。适用于对象比较浅或者嵌套层次不复杂的情况。

生拷贝:不仅复制对象本身,还地柜复制内部嵌套的引用对象,确保完全独立。适用于需要完全隔离两个对象的情况。

等号:是引用赋值,与深/浅拷贝不同的是,深/浅拷贝创建了新对象。

浅拷贝

浅拷贝创建一个新的对象,但对于对象中的可变引用类型(如列表、字典),它进复制引用,而不复制对象本身。

因此浅拷贝后的对象与源对象共享内部的可变对象。这意味着修改其中一个对象中的可变类型内容时,另一个对象也会受到影响。

import copy # 原始对象 original = [[1, 2, 3], 4, 5] # 浅拷贝 shallow_copy = copy.copy(original) # 修改浅拷贝中的嵌套列表 shallow_copy[0][0] = 'a' print("原始对象:", original) print("浅拷贝对象:", shallow_copy)

Python浅拷贝案例

深拷贝

深拷贝不仅创建了一个新对象,而且对于对象中的所有嵌套对象(包括可变引用类型),它也会递归地复制一份新对象,而不是共享引用。

因此,深拷贝后的对象与原对象是完全独立的,即使修改其中一个对象中的嵌套对象,另一个对象也不会受到影响。

import copy # 原始对象 original = [[1, 2, 3], 4, 5] # 深拷贝 deep_copy = copy.deepcopy(original) # 修改 深拷贝中嵌套的列表 deep_copy[0][0] = 'b' print("原始对象:", original) print("深拷贝对象:", deep_copy)

Python深拷贝案例

等号

原创:有勇气的牛排
https://www.couragesteak.com/article/478

等号(=)赋值并不是一种拷贝操作,而是引用赋值。

当使用等号将一个对象赋值给另一个变量时,两个变量实际上共享同一个对象,即它们引用的是同一块内存地址。

因此修改其中一个变量的内容,另一个变量也会受到影响。

与深浅拷贝不同的是,深浅拷贝创建了新对象。

# 原始对象 a = [1, 2, 3] # 等号赋值 b = a # 修改b b[0] = '有勇气的牛排' print("a: ", a) print("b: ", b)

Python等号


留言

专栏
文章
加入群聊