python的浅拷贝和深拷贝的区别

# -*- 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。

简而言之,深拷贝与浅拷贝的区别在于当拷贝引用值时,是否需要拷贝引用值对应的对象

原文地址:https://www.cnblogs.com/xueguangfeng/p/Python_Shallow_Deep_Copy.html