不理解shallowcopy用意何在?

在学deepcopy

import copy
l=[["a","b"],2,3,4,5]
s=copy.copy(l)
d=copy.deepcopy(l)
print("l:",l,id(l),"***","d:",d,id(d),"***","s:",s,id(s))
l[1]="x" #为什么这里shallow copy不跟着变呢?
print("l:",l,id(l),"***","d:",d,id(d),"***","s:",s,id(s))
l[0][0]=100 #为什么这里shallow copy跟着变呢,是不是shallow copy只更新“二级嵌套“的变化?
print("l:",l,id(l),"***","d:",d,id(d),"***","s:",s,id(s))


结果
l: [['a', 'b'], 2, 3, 4, 5] 39303688 d: [['a', 'b'], 2, 3, 4, 5] 39408072 s: [['a', 'b'], 2, 3, 4, 5] 39406984
l: [['a', 'b'], 'x', 3, 4, 5] 39303688 d: [['a', 'b'], 2, 3, 4, 5] 39408072 s: [['a', 'b'], 2, 3, 4, 5] 39406984
l: [[100, 'b'], 'x', 3, 4, 5] 39303688 d: [['a', 'b'], 2, 3, 4, 5] 39408072 s: [[100, 'b'], 2, 3, 4, 5] 39406984

我的直觉是shallow copy是原对象做了什么调整,shallow copy出的对象就做什么调整,形成一个镜像,而deepcopy就是一个复制出来的完全独立的,与原对象无关的对象。

实际测试不是这个样子,感觉shallow copy 只会更新“”二级对象“”“,为什么呢?这样设置的shallow copy 有何妙用?

阅读 1.9k
2 个回答

深拷贝和浅拷贝中有一个特殊的规则,对于非容器类型(如数字、字符串、和其他'原子'类型的对象)没有拷贝这一说
也就是说,对于这些类型,"obj is copy.copy(obj)" 、"obj is copy.deepcopy(obj)"。

详细的可以看下这篇文章,讲的很详细:
http://www.cnblogs.com/wilber...

1.对象的拷贝方法数字类型的是拷贝数值,其他全部是拷贝地址,你的两个对象里面的["a","b"]内存是一样的,所以修改引用类型的数值,其他引用到这个的都会跟着改变.

2.python数据类型如下,包括自定义类:

Number(数字)
    int(整型)
    float(浮点型)
    complex(复数)
    bool(布尔)
String(字符串)
List(列表)
Tuple(元组)
Sets(集合)
Dictionary(字典)
自定义类

3.其他的你的例子中都有,自定义类的例子如下:

    class Person:
        def __init__(self,name):
            self.name = name
        def __repr__(self):
            return self.name
    lst0 = [1,Person("小明"), 5]
    lst1 = lst0.copy()
    print(lst0 ==lst1,lst1,lst0,id(lst1),id(lst0))
    lst0[1].name="小云"
    print(lst0 ==lst1,lst1,lst0,id(lst1),id(lst0))
结果:
True [1, 小明, 5] [1, 小明, 5] 66244280 66311632
True [1, 小云, 5] [1, 小云, 5] 66244280 66311632
和你的一样,修改引用类型会修改所有指向这个地址的对象.

4.字符串和元祖不支持修改

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题