【问题标题】:Changing object mutability using shallow/deep copy使用浅/深拷贝更改对象可变性
【发布时间】:2019-07-17 12:32:24
【问题描述】:

我正在尝试对可变和不可变类型的普通复制(赋值)、浅复制和深复制概念进行尝试。

List 是可变的 - 因此当分配给另一个对象时,对另一个对象的任何附加(或使用索引值更改值)都会影响原始对象。对新对象的分配不会影响原始对象。

String 是不可变的 - 因此当分配给另一个对象时,对另一个对象的任何更改,无论是修改还是分配都不会影响原始对象。

我想知道是否可以使用浅拷贝概念来使字符串行为可变和列表不可变。从下面的实验中,我注意到字符串对象(不可变)上的浅/深复制不会影响其不可变行为。列表对象的浅/深副本(可变)使其不可变。

请您对此有所了解。

 import copy

    print('----------LIST BEHAVIOUR - MUTABLE----------')

    l1=[1,2,3]
    print(l1)
    l2=l1
    print(l2)
    l2[2]=10
    l2.append(22)
    print(l2)
    print(l1)

    print('----------LIST SHALLOW COPY----------')

    l1=[1,2,3]
    print(l1)
    l2=copy.copy(l1)
    print(l2)
    l2[2]=10
    l2.append(22)
    print(l2)
    print(l1)

    print('----------LIST DEEP COPY----------')

    l1=[1,2,3]
    print(l1)
    l2=copy.deepcopy(l1)
    print(l2)
    l2[2]=10
    l2.append(22)
    print(l2)
    print(l1)

    print('----------STRING BEHAVIOUR - IMMUTABLE----------')

    str1='abc'
    print(str1)
    str2=str1
    print(str2)
    str2='xyz'
    print(str2)
    print(str1)

    print('----------STRING SHALLOW COPY----------')

    str1='abc'
    print(str1)
    str2=copy.copy(str1)
    print(str2)
    str2='xyz'
    print(str2)
    print(str1)

    print('----------STRING DEEP COPY----------')

    str1='abc'
    print(str1)
    str2=copy.copy(str1)
    print(str2)
    str2='xyz'
    print(str2)
    print(str1)

输出:

----------LIST BEHAVIOUR - MUTABLE----------
[1, 2, 3]
[1, 2, 3]
[1, 2, 10, 22]
[1, 2, 10, 22]
----------LIST SHALLOW COPY----------
[1, 2, 3]
[1, 2, 3]
[1, 2, 10, 22]
[1, 2, 3]
----------LIST DEEP COPY----------
[1, 2, 3]
[1, 2, 3]
[1, 2, 10, 22]
[1, 2, 3]
----------STRING BEHAVIOUR - IMMUTABLE----------
abc
abc
xyz
abc
----------STRING SHALLOW COPY----------
abc
abc
xyz
abc
----------STRING DEEP COPY----------
abc
abc
xyz
abc

【问题讨论】:

    标签: python


    【解决方案1】:

    当您创建列表副本时,您正在创建新列表并且更改它不会更改原始列表。你没有让它不可变,你只是创建了一个新列表。

    由于字符串是不可变的,因此创建副本与分配它相同。在这两种情况下,都会创建一个新字符串。你不能让它可变。

    【讨论】:

      【解决方案2】:

      它不像你想象的那样工作。复制就是复制,仅此而已。浅拷贝意味着只拷贝当前容器中的元素。而深拷贝意味着递归地复制嵌套容器中所有可能的元素。

      并且 assign 正在改变引用。在更改值类型和字符串的引用时,将创建一个副本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-12
        • 2015-01-13
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多