Python赋值语句与深拷贝、浅拷贝的区别

时间:2022-09-06 19:49:54

参考:http://*.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-deepcopy-and-normal-assignm

  • 正常赋值语句会使左操作数简单地指向右操作数指向的对象。

深拷贝和浅拷贝之间的区别仅对复合变量起作用,复合变量指的是对象中又包含了对象,如list,class,dict。

  • 一次浅拷贝会构造一个新的复合对象,然后将原始对象中的所有引用插入到新的复合对象中。
  • 一次深拷贝也会构造一个新的复合对象,但会递归地将原始对象中的所有对象拷贝一份到新的复合对象中。

对于非复合变量, 赋值语句,深拷贝,浅拷贝都实现的是赋值语句功能。

例子

import copy
a = [1, 2, 3]
d = [4, 5, 6]
c = [a, b]

如果使用正常赋值语句:

d = c

print id(c) == id(d) # True - d和c指向同一个对象
print id(c[0]) == id(d[0]) # True - d[0]和c[0]当然也是同一对象

使用浅拷贝的话:

d = copy.copy(c)

print id(c) == id(d) # False - d是一个新对象,浅拷贝会构造一个新的复合对象
print id(c[0]) == id(d[0]) # True - 但复合对象中的对象不会复制,和原来的指向一样

使用深拷贝的话:

d = copy.deepcopy(c)

print id(c) == id(d) # False - d同一是个全新的复合对象
print id(c[0]) == id(d[0]) # False - 复合对象中对象也同样进行拷贝