引子:需求:

  1、copy一下原来的列表,产生一个新的列表。

  2、两个列表需要完全独立开,即一方的操作不会对另一方产生任何影响。

一、浅copy

  1、定义:生成一个新列表,把原列表的第一层的内存地址不加区分地完全copy给新列表。

  2、效果:

    ①对其中一个列表中的不可变类型的赋值操作,都是产生了新值,让该列表的索引指向了新的内存地址,所以并不会影响另一个列表。

    ②对其中一个列表中的可变类型的操作,只是改变的该可变类型的中包含的值,但整体内存地址没有变,因为两个列表中包含的是同一份内存地址,所以另外一个列表中的可变类型会同步改变,其实可以理解为两个列表此时内部包含的该可变类型是共享的。

a = [1,2,[33,44]]  # 原列表
b = a.copy()  # 复制的新列表
a[0] = 5  
a[1] = 6  # 将原列表中的不可表类型重新赋值
a[2][0] = 77
a[2][1] = 88  # 将原列表中的可变类型中的值更改
print(a)  # 结果为[5, 6, [77, 88]]
print(b)  # 结果为[1, 2, [77, 88]],即新列表中的不可变类型不会随原列表更改而变化,而可变类型会随之变化

  3、结论:这种浅copy的方式只能满足产生与原列表一样的新列表,无法满足两个列表完全独立。

二、深copy

  1、定义:生成一个新列表,检索原列表中的类型,把不可变类型的内存地址完全copy给新列表,在新列表中新建内存空间,重新生成内存地址,把可变类型的仅是值放入。

  2、效果:对其中一个列表的操作不会对另一个列表产生任何影响。

import copy  # 调用copy模块功能

a = [1,2,[33,44]]  # 原列表
b = copy.deepcopy(a)  # 复制的新列表
a[0] = 5
a[1] = 6  # 将原列表中的不可变类型重新赋值
a[2][0] = 77
a[2][1] = 88  # 将原列表中的可变类型中的值更改
print(a)  # 结果为[5, 6, [77, 88]]
print(b)  # 结果为[1, 2, [33, 44]],新列表中可变与不可变类型都没有随着原列表的更改而变化,可见已完全独立开

三、结论:要实现开头的需求,需要使用深copy。

 

posted on 2020-01-02 09:01  焚音留香  阅读(131)  评论(0编辑  收藏  举报