美文网首页
Python浅拷贝与深拷贝

Python浅拷贝与深拷贝

作者: Aresx | 来源:发表于2019-07-09 17:45 被阅读0次

    Python浅拷贝与深拷贝

    讨论import copycopy.copycopy.deepcopy区别。

    根据官方文档所述,这两种复制区别仅与复杂对象有关,复杂对象可以理解为嵌套了另一个数据类型,比如字典中包含列表。

    简单数据类型

    不可变类型

    a = 100
    print("a原始地址:%d" % id(a))
    b = copy.copy(a)
    print("b浅拷贝地址:%d" % id(b))
    c = copy.deepcopy(a)
    print("c深拷贝地址:%d" % id(c))
    

    输出:

    a原始地址:140734756253424
    b浅拷贝地址:140734756253424
    c深拷贝地址:140734756253424
    

    对于不可变类型,无论深浅拷贝地址都没有变化。

    可变类型

    list_a = [1, 2, 3]
    print("list_a原始地址:%d" % id(list_a))
    print("list_a中元素地址:%d" % id(list_a[0]))
    list_b = copy.copy(list_a)
    print("list_b浅拷贝地址:%d" % id(list_b))
    print("list_b中元素地址:%d" % id(list_b[0]))
    list_c = copy.deepcopy(list_a)
    print("list_c深拷贝地址:%d" % id(list_c))
    print("list_c中元素地址:%d" % id(list_c[0]))
    

    输出:

    list_a原始地址:2492188109000
    list_a中元素地址:140734229209744
    list_b浅拷贝地址:2492188207944
    list_b中元素地址:140734229209744
    list_c深拷贝地址:2492188206728
    list_c中元素地址:140734229209744
    

    无论深浅拷贝,变量整体地址都发生了改变。但是其中元素地址并没有变化。

    复杂数据类型

    dic_list_a = {"1": "a", "2": "b", "3": [1, 2, 3]}
    print("dic_list_a原始地址:%d" % id(dic_list_a))
    print("dic_list_a元素地址:%d" % id(dic_list_a["1"]))
    dic_list_b = copy.copy(dic_list_a)
    print("dic_list_b浅拷贝地址:%d" % id(dic_list_b))
    print("dic_list_b元素地址:%d" % id(dic_list_b["1"]))
    dic_list_c = copy.deepcopy(dic_list_a)
    print("dic_list_c深拷贝地址:%d" % id(dic_list_c))
    print("dic_list_c元素地址:%d" % id(dic_list_c["1"]))
    

    输出:

    dic_list_a原始地址:2863672895384
    dic_list_a元素地址:2863672765048
    dic_list_b浅拷贝地址:2863672895816
    dic_list_b元素地址:2863672765048
    dic_list_c深拷贝地址:2863674603992
    dic_list_c元素地址:2863672765048
    

    结果与简单数据类型中可变类型结论一样。

    dic_list_a = {"1": "a", "2": "b", "3": [1, 2, 3]}
    print("dic_list_a原始地址:%d" % id(dic_list_a))
    print("dic_list_a元素地址:%d" % id(dic_list_a["3"]))
    dic_list_b = copy.copy(dic_list_a)
    print("dic_list_b浅拷贝地址:%d" % id(dic_list_b))
    print("dic_list_b元素地址:%d" % id(dic_list_b["3"]))
    dic_list_c = copy.deepcopy(dic_list_a)
    print("dic_list_c深拷贝地址:%d" % id(dic_list_c))
    print("dic_list_c元素地址:%d" % id(dic_list_c["3"]))
    

    输出:

    dic_list_a原始地址:2435944785816
    dic_list_a元素地址:2435974948360
    dic_list_b浅拷贝地址:2435944786248
    dic_list_b元素地址:2435974948360
    dic_list_c深拷贝地址:2435974937048
    dic_list_c元素地址:2435974948296
    

    无论深浅拷贝变量整体地址都发生了变化。如果是浅拷贝嵌套的对象地址不变,如果是深拷贝嵌套的对象地址发生改变。

    初学python,如对知识点理解有误还请指正。欢迎补充不足之处,看到后我会及时补充进文章中。

    相关文章

      网友评论

          本文标题:Python浅拷贝与深拷贝

          本文链接:https://www.haomeiwen.com/subject/dfsfkctx.html