使用浅层/深层副本更改对象可变性

时间:2019-07-17 12:32:24

标签: python

我正在尝试使用适用于可变和不可变类型的普通复制(赋值),浅层复制和深层复制的概念。

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

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

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

请您对此有所了解。

 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

2 个答案:

答案 0 :(得分:0)

创建列表副本时,您将创建新列表,并且对其进行更改不会更改原始列表。您并没有使其一成不变,而是创建了一个新列表。

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

答案 1 :(得分:0)

它不起作用,如您所想。复制就是复制,仅此而已。浅复制意味着只复制当前容器中的元素。深层复制意味着递归复制嵌套容器中的所有可能元素。

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