# -*- coding:utf-8 -*- import copy a = ['test', [[1,2],3]] b = a c = copy.copy(a) d = copy.deepcopy(a) print id(b), id(a), id(c), id(d) print [id(x) for x in a] print [id(x) for x in b] print [id(x) for x in c] print [id(x) for x in d] print [id(x) for x in a[1]] print [id(x) for x in c[1]] print [id(x) for x in d[1]]
输出
28776488 28776488 28791512 28791552
[28583936, 28763480]
[28583936, 28763480]
[28583936, 28763480]
[28583936, 28791632]
[28763400, 19783312]
[28763400, 19783312]
[28791592, 19783312]
首先得明白a对象里有什么,对象a是一个list,list中的每个元素都是一个指向某个对象的引用。
浅拷贝
c = copy.copy(a)的过程是,创建一个新的list对象c,将a中每个引用的值赋给对应的c中的引用,
所以c的两个引用的值与a中两个引用的值相同
深拷贝
d = copy.deepcopy(a)的过程是,创建一个新的list对象d,将a中每个引用的值赋给对应d中的引用,
在赋值之前,判断该引用所指向的对象是否为mutable对象,如果是,则创建一个该mutable对象的深拷贝,并将引用指向该对象,
如果不是,则直接将a中的引用赋给d。
简而言之,深拷贝与浅拷贝的区别在于当拷贝引用值时,是否需要拷贝引用值对应的对象