鱼C论坛

 找回密码
 立即注册
查看: 2193|回复: 2

[已解决]关于深浅拷贝的问题

[复制链接]
发表于 2021-6-13 15:49:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# coding: utf-8

old_list = [1, 2, 3, [1]]
new_list = old_list.copy()

new_list.append('666')

print(old_list, id(old_list))
print(new_list, id(new_list))


运行结果:
[1, 2, 3, [1]] 442108923712
[1, 2, 3, [1], '666'] 442110592448


# coding: utf-8

old_list = [1, 2, 3, [1]]
new_list = old_list.copy()

new_list[3].append('666')

print(old_list, id(old_list))
print(new_list, id(new_list))

运行结果:
​[1, 2, 3, [1, '666']] 814921142080
[1, 2, 3, [1, '666']] 814922811776

请依次从地址的角度详细解释一下
最佳答案
2021-6-13 15:57:06


直接举些例子,先看看这两拷贝的区别:

这里我们用Python内置函数 id() 来查看他们的内存地址是否相同,相同说明是同一个数据
import copy

l = [[1,2,3],1,2,3]
x = copy.copy(l)     # 浅拷贝:这里相当于列表切片[:]
z = copy.deepcopy(l)  # 深拷贝
print('   原列表id地址:',id(l),'\n浅拷贝列表id地址:',id(x),'\n深拷贝列表id地址:',id(z))

运行结果:
   原列表内元素id地址: 1708146868416 
浅拷贝列表内元素id地址: 1708149001152 
深拷贝列表内元素id地址: 1708149000448
三个列表的 id 全部不相同,说明浅拷贝是直接创建了新的列表,那列表内的元素呢?我们接下来看看下面的运行情况:
import copy

l = [[1,2,3],1,2,3]
x = copy.copy(l)     # 浅拷贝:这里相当于列表切片[:]
z = copy.deepcopy(l)  # 深拷贝
print('   原列表内元素id地址:',id(l[0]),'\n浅拷贝列表内元素id地址:',id(x[0]),'\n深拷贝列表内元素id地址:',id(z[0]))

运行结果:
   原列表内元素id地址: 2351807077120 
浅拷贝列表内元素id地址: 2351807077120 
深拷贝列表内元素id地址: 2351808203584

会发现浅拷贝的元素id和原来列表id相同,所以浅拷贝没有列表内的元素进行拷贝

深拷贝的元素id与原先列表不同,所以深拷将列表内的元素彻彻底底的进行拷贝了

简单的说,就是深拷贝是完完全全的复制一遍,然后创建了新的列表,而浅拷贝只复制了列表的外壳,而内部元素还是没有拷贝成新的~

注意的是:这些拷贝对所有可变类容器的来说都有这种性质,比如:列表、元组、字典、集合


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-13 15:57:06 | 显示全部楼层    本楼为最佳答案   


直接举些例子,先看看这两拷贝的区别:

这里我们用Python内置函数 id() 来查看他们的内存地址是否相同,相同说明是同一个数据
import copy

l = [[1,2,3],1,2,3]
x = copy.copy(l)     # 浅拷贝:这里相当于列表切片[:]
z = copy.deepcopy(l)  # 深拷贝
print('   原列表id地址:',id(l),'\n浅拷贝列表id地址:',id(x),'\n深拷贝列表id地址:',id(z))

运行结果:
   原列表内元素id地址: 1708146868416 
浅拷贝列表内元素id地址: 1708149001152 
深拷贝列表内元素id地址: 1708149000448
三个列表的 id 全部不相同,说明浅拷贝是直接创建了新的列表,那列表内的元素呢?我们接下来看看下面的运行情况:
import copy

l = [[1,2,3],1,2,3]
x = copy.copy(l)     # 浅拷贝:这里相当于列表切片[:]
z = copy.deepcopy(l)  # 深拷贝
print('   原列表内元素id地址:',id(l[0]),'\n浅拷贝列表内元素id地址:',id(x[0]),'\n深拷贝列表内元素id地址:',id(z[0]))

运行结果:
   原列表内元素id地址: 2351807077120 
浅拷贝列表内元素id地址: 2351807077120 
深拷贝列表内元素id地址: 2351808203584

会发现浅拷贝的元素id和原来列表id相同,所以浅拷贝没有列表内的元素进行拷贝

深拷贝的元素id与原先列表不同,所以深拷将列表内的元素彻彻底底的进行拷贝了

简单的说,就是深拷贝是完完全全的复制一遍,然后创建了新的列表,而浅拷贝只复制了列表的外壳,而内部元素还是没有拷贝成新的~

注意的是:这些拷贝对所有可变类容器的来说都有这种性质,比如:列表、元组、字典、集合


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2022-2-6 15:27:53 | 显示全部楼层
Twilight6 发表于 2021-6-13 15:57
直接举些例子,先看看这两拷贝的区别:

这里我们用Python内置函数 id() 来查看他们的内存地址是否相 ...

佩服
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 13:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表