Python 列表复制
关于Python 列表的复制,有多种方法,常用的 有 赋值、切片、list、copy,copy.deepcopy等。
但是 实际用时 又有区别,不小心可能就用错了。
接下来 简单举例 说明一下 使用
import copy a = [1,2,3,4] b = a c = a[:] d = a.copy() e = copy.copy(a) f = copy.deepcopy(a) g = list(a) print('id(a):%d,id(b):%d' % (id(a),id(b)))print('id(c):%d' % (id(c))) print('a:%s,b:%s,c%s'%(a,b,c)) a[2] = 5 del a[3] print('a:%s,b:%s,c%s'%(a,b,c)) print('id(d):%d' % (id(d))) print('d:%s' % d) print('id(e):%d' % (id(e))) print('e:%s' % e) print('id(f):%d' % (id(f))) print('f:%s' % f) print('id(g):%d' % (id(g))) print('g:%s' % g)
执行 结果如下
id(a):4409071368,id(b):4409071368 id(c):4409070344 a:[1, 2, 3, 4],b:[1, 2, 3, 4],c[1, 2, 3, 4] a:[1, 2, 5],b:[1, 2, 5],c[1, 2, 3, 4] # 以上可知 a、b id 一致,改变a 则 b 也会改变 # 一下 id 则都不相同 id(d):4408193736 d:[1, 2, 3, 4] id(e):4409091336 e:[1, 2, 3, 4] id(f):4409091400 f:[1, 2, 3, 4] id(g):4409091080 g:[1, 2, 3, 4]
换一种 内嵌列表的列表复制
names = ["小明", "小红", ["张三", "李四", "王五"], "小黑", "小黄", "小白"] # 复制一份列表 names2 = names.copy() # 把李四 改成英文 names[2][1] = "Lisi" print(names) print(names2)
# 执行结果 ['小明', '小红', ['张三', 'Lisi', '王五'], '小黑', '小黄', '小白'] ['小明', '小红', ['张三', 'Lisi', '王五'], '小黑', '小黄', '小白']
这段代码的运行结果是,两个列表的李四都变成了英文,来分析一下原理
其实这个图也挺简单的,就是中间那个列表是单独分配了一块空间,然后从第一层列表中去引用地址,复制的names2 也是引用的地址,所以真实的值一变,两个列表的内部列表的值也就变了。
也就是说 list.copy() 方法只能 copy 一层,这就是所谓的浅复制。
补充:第二个列表copy 第一个列表,实际上第二个列表的每个元素是第一个列表每个元素的引用
实现浅复制的三种方法
import copy names = ["小明", "小红", "小黑", "小黄", "小白"] # 浅copy 1. names1 = copy.copy(names) # 2. names2 = names[:] # 3. 工厂函数 names3 = list(names)
深复制的方法
import copy names = ["小明", "小红", "小黑", ["粉色"], "小黄", "小白"] # 深复制 deep_names = copy.deepcopy(names) # 修改粉色为 Pink names[3][0] = "Pink" # 分别打印输出两个列表 print(names) print(deep_names)
# 输出结果为: ['小明', '小红', '小黑', ['Pink'], '小黄', '小白'] ['小明', '小红', '小黑', ['粉色'], '小黄', '小白']
如下例
a = [[10], 20] b = a[:] c = list(a) d = a * 1 e = copy.copy(a) f = copy.deepcopy(a) a.append(21) a[0].append(11) print (id(a), a) # 4317123656 [[10, 11], 20, 21] print (id(b), b) # 4317123592 [[10, 11], 20] print (id(c), c) # 4317123848 [[10, 11], 20] print (id(d), d) # 4317082888 [[10, 11], 20] print (id(e), e) # 4317123720 [[10, 11], 20] print (id(f), f) # 4317123784 [[10], 20]