mulinyurui 发表于 4 天前

浅拷贝和深拷贝

>>> x =
>>> y = x.copy()
>>> x = 1
>>> x

>>> y
为什么y不变?
>>> x =
>>> y = x[:]
>>> y

>>> x = 1
>>> y

>>> x = [,,]
>>> y = x.copy()
>>> x = 0
>>> x
[, , ]
>>> y
[, , ]为什么y变了?都是浅拷贝,为什么一维的不变,二维的会变?
>>> import copy
>>> x = [,,]
>>> y = copy.copy(x)
>>> x = 0
>>> x
[, , ]
>>> y
[, , ]
>>> x = [,,]
>>> y = copy.deepcopy(x)
>>> x = 0
>>> x
[, , ]
>>> y
[, , ]为什么y又不变了?
>>>

FishC 发表于 4 天前

关于浅拷贝和深拷贝的区别,我来用通俗易懂的方式解释:

### 一维列表的例子(y不变的原因)

>>> x =
>>> y = x.copy()# 浅拷贝:创建新列表,复制元素引用
>>> x = 100   # 修改x的第一个元素
>>> x

>>> y
       # y不变

原因:
1. 浅拷贝创建了新列表y,但元素仍是原对象的引用
2. 整数1是不可变对象,x = 100实际是让x指向新对象
3. y仍然指向原来的整数1

### 二维列表的例子(y变化的原因)

>>> x = [, ]
>>> y = x.copy()# 浅拷贝:只复制最外层
>>> x = 100 # 修改内层元素
>>> x
[, ]
>>> y
[, ]# y跟着变化

原因:
1. 浅拷贝只创建了外层新列表
2. 内层的子列表和仍是同一个对象
3. 修改子列表内容时,所有引用该子列表的变量都会看到变化

### 深拷贝的例子(y不变的原因)

>>> import copy
>>> x = [, ]
>>> y = copy.deepcopy(x)# 深拷贝:递归复制所有层级
>>> x = 100
>>> x
[, ]
>>> y
[, ]# y不受影响

原因:
1. 深拷贝会递归复制所有嵌套对象
2. 创建了全新的子列表和
3. x和y的内层对象完全独立

### 总结表格

操作类型复制深度嵌套对象影响
直接赋值 (y = x)零复制完全同步变化
浅拷贝 (y = x.copy())仅最外层嵌套对象会同步变化
深拷贝 (copy.deepcopy())所有层级完全独立


关键点:
o 浅拷贝:适合单层不可变对象(如整数、字符串)
o 深拷贝:必需用于多层可变对象(如嵌套列表、字典)
o 修改外层:浅拷贝的新对象不受影响
o 修改内层:浅拷贝的新对象会受影响

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

gpa5031 发表于 4 天前

还是没有完全理解,是不是我理解能力有问题

mulinyurui 发表于 4 天前

我还是不明白,为什么浅拷贝和深拷贝应用到一维和二维都会有区别?

mulinyurui 发表于 4 天前

为什么一维列表修改元素y不变,二维列表修改元素y确变了?

pyzyd 发表于 4 天前

mulinyurui 发表于 2025-7-27 21:44
为什么一维列表修改元素y不变,二维列表修改元素y确变了?

因为是浅拷贝,只拷贝了外面的,所以里面会变,
不需要怎么理解,只要知道浅拷贝和深拷贝的区别和作用就行了吧{:10_307:}

mulinyurui 发表于 4 天前

pyzyd 发表于 2025-7-27 21:55
因为是浅拷贝,只拷贝了外面的,所以里面会变,
不需要怎么理解,只要知道浅拷贝和深拷贝的区别和作用就 ...

一维列表没有里面吗?

pyzyd 发表于 4 天前

mulinyurui 发表于 2025-7-27 22:03
一维列表没有里面吗?

。。。
我的意思是只拷贝了一层{:10_302:}

小甲鱼的二师兄 发表于 4 天前

本帖最后由 小甲鱼的二师兄 于 2025-7-27 22:56 编辑

浅拷贝:只复制最外层,里面的对象还是同一个。

import copy

a = ]
b = copy.copy(a)# 或者 b = a[:]

b = 100
print(a)# ]
print(b)# ]

b = 300
print(a)# ]
print(b)# ]

深拷贝:所有层都复制,完全独立。

import copy

a = ]
b = copy.deepcopy(a)

b = 100
print(a)# ]
print(b)# ]

b = 300
print(a)# ]
print(b)# ]

小甲鱼的二师兄 发表于 4 天前

本帖最后由 小甲鱼的二师兄 于 2025-7-27 22:58 编辑

仔细对比一下上面的例子,应该可以快速的了解它们的区别。

其实只需要记住,对于超过一维的复杂对象,就要使用深拷贝。

某一个“天” 发表于 4 天前

你猜这深浅指什么
一维是浅,多维是深

ydwb 发表于 3 天前

对于超过一维的复杂对象,就要使用深拷贝。
页: [1]
查看完整版本: 浅拷贝和深拷贝