|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
请依次从地址的角度详细解释一下
直接举些例子,先看看这两拷贝的区别:
这里我们用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与原先列表不同,所以深拷将列表内的元素彻彻底底的进行拷贝了
简单的说,就是深拷贝是完完全全的复制一遍,然后创建了新的列表,而浅拷贝只复制了列表的外壳,而内部元素还是没有拷贝成新的~
要注意的是:这些拷贝对所有可变类容器的来说都有这种性质,比如:列表、元组、字典、集合
|
|