[Python]浅拷贝与深拷贝

来源:互联网 发布:oppo应用分身软件 编辑:程序博客网 时间:2024/06/13 08:53
1、对象赋值
当对象被创建并(将其引用)赋值给变量时,该对象的引用计数就被设置为1。
当同一对象又被赋值给其他变量时,或者作为参数传递给函数、方法或类实例时,或者被赋值为一个窗口对象的成员时,
该对象的一个新的引用(或称为别名)被创建,该对象的计数自动加1。
2、浅拷贝
(1)完全切片操作
(2)利用工厂函数,如list(), dict()等
(3)使用copy模块的copy函数
浅拷贝就是新创建一个类型跟原对象一样,内容是原来对象元素的引用。
浅拷贝时,如果其中的对象是不可变的,则新创建一个元素。如果是可变元素(如list),则只是把它的引用复制,并没有复制成员。
3、深拷贝
创建一个新的容器,包含原有对象元素的全新拷贝

>>> import copy>>>>>> a = [1, 2, 3, ['a', 'b']]    # 创建一个list对象,并将其引用赋值给 a>>> b = a                        # 创建了一个指向同一对象的别名 b,该对象的引用计数增加1>>> sliceCopy = a[:]             # 切片操作>>> facCopy = list(a)            # 工厂方法操作>>> shallowCopy = copy.copy(a)   # 浅拷贝>>> deepCopy = copy.deepcopy(a)  # 深拷贝

# 可以看到,a 和 b 的ID完全一样,同一个对象的两个引用,修改其中一个的元素,另外一个也会改变。# 浅拷贝和深拷贝的ID与 a的不一样,修改其中不可改变元素时,其他变量中对应的元素不会改变。# 浅拷贝中 可变元素(list)的ID 与 a 中的一样,所以修改list中的元素时,其他变量中的list元素也会相应改变。# 深拷贝中 可变元素(lsit)的ID 与 a 中的不一样,所以deepCopy 与 a 的修改完全独立,互不干扰。>>> [id(i) for i in (a, b, sliceCopy, facCopy, shallowCopy, deepCopy)][11107304, 11107304, 11107344, 11125144, 11141608, 11107184]>>> [id(i) for i in (a[3], b[3], sliceCopy[3], facCopy[3], shallowCopy[3], deepCopy[3])][11107104, 11107104, 11107104, 11107104, 11107104, 11107064]

>>> a.append(4)>>> a[3].append('c')>>>>>> a[1, 2, 3, ['a', 'b', 'c'], 4]>>> b[1, 2, 3, ['a', 'b', 'c'], 4]>>> sliceCopy[1, 2, 3, ['a', 'b', 'c']]>>> facCopy[1, 2, 3, ['a', 'b', 'c']]>>> shallowCopy[1, 2, 3, ['a', 'b', 'c']]>>> deepCopy[1, 2, 3, ['a', 'b']]>>>>>> sliceCopy[0] = 9>>> sliceCopy[9, 2, 3, ['a', 'b', 'c']]>>> a[1, 2, 3, ['a', 'b', 'c'], 4]>>> b[1, 2, 3, ['a', 'b', 'c'], 4]


0 0
原创粉丝点击