easyboy 发表于 2021-6-13 15:49:52

关于深浅拷贝的问题

# coding: utf-8

old_list = ]
new_list = old_list.copy()

new_list.append('666')

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


运行结果:
] 442108923712
, '666'] 442110592448


# coding: utf-8

old_list = ]
new_list = old_list.copy()

new_list.append('666')

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

运行结果:
​] 814921142080
] 814922811776

请依次从地址的角度详细解释一下

Twilight6 发表于 2021-6-13 15:57:06



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

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

l = [,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]
x = copy.copy(l)   # 浅拷贝:这里相当于列表切片[:]
z = copy.deepcopy(l)# 深拷贝
print('   原列表内元素id地址:',id(l),'\n浅拷贝列表内元素id地址:',id(x),'\n深拷贝列表内元素id地址:',id(z))

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

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

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

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

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


不弃_ 发表于 2022-2-6 15:27:53

Twilight6 发表于 2021-6-13 15:57
直接举些例子,先看看这两拷贝的区别:

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

佩服
页: [1]
查看完整版本: 关于深浅拷贝的问题