Python 赋值、浅拷贝和深度拷贝

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liangxy2014/article/details/79312396

前言:
在创建二维数组时,遇到了list * n—>n shallow copies of list concatenated, n个list的浅拷贝的连接的情况

赋值、浅拷贝和深度拷贝

  • 赋值:是对象的引用
  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象
  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
  • 拷贝即是开辟一块新的内存空间,把被拷贝对象中的值复制过去

注意:

  • 我们寻常意义的赋值就是深copy,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
  • 而浅拷贝并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。

  • 对于简单的 object,用 shallow copy(浅拷贝) 和 deep copy(深拷贝) 没区别
  • 对于复杂的 object, 如 list 中套着 list 的情况,shallow copy 中的 子list,并未从原 object 真的「独立」出来。也就是说,如果你改变原 object 的子 list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对「复制」的理解不同。
  • ps:何为简单的 object、复杂的object,暂时未找到合适的定义。那就从实例出发吧

简单的 object的实例说明:

import copy
a = [1, 2, 3]
b = a                  # 赋值,传对象的引用
c = copy.copy(a)       # 对象拷贝,浅拷贝
d = copy.deepcopy(a)   # 对象拷贝,深拷贝
print '第一次输出:', a, b, c, d
a[0] = 0               # 修改对象
print '第二次输出:', a, b, c, d

输出结果:

第一次输出: [1, 2, 3] [1, 2, 3] [1, 2, 3] [1, 2, 3]
第二次输出: [0, 2, 3] [0, 2, 3] [1, 2, 3] [1, 2, 3]

可以验证->对于简单的 object,用 shallow copy(浅拷贝) 和 deep copy(深拷贝) 没区别。
c,d在拷贝时,开辟了一片新的内存空间,所以即便a发生变化,也不会影响c,d。

复杂的 object的实例说明:

a2 = [1, 2, [3, 4]]
b2 = a2
c2 = copy.copy(a2)
d2 = copy.deepcopy(a2)
print '第一次输出:', a2, b2, c2, d2
a2[0] = 0
print '第二次输出:', a2, b2, c2, d2
a2[2].append(5)
print '第三次输出:', a2, b2, c2, d2

输出结果为:

第一次输出: [1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]]
第二次输出: [0, 2, [3, 4]] [0, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]]
第三次输出: [0, 2, [3, 4, 5]] [0, 2, [3, 4, 5]] [1, 2, [3, 4, 5]] [1, 2, [3, 4]]

ps:参考链接
http://blog.csdn.net/qq_32907349/article/details/52190796

猜你喜欢

转载自blog.csdn.net/liangxy2014/article/details/79312396