更改浅复制中的列表元素

ten*_*boy 2 python list shallow-copy

我有一个关于列表浅复制的问题。

在这两个示例中,我都修改了列表的一个元素,但在示例 1 中,列表b发生了更改,而在示例 2 中,列表d没有更改。我很困惑,因为在这两个示例中,我修改了列表的元素。

有什么不同?

示例1:

a=[1,2,[3,5],4]
b=list(a)
a[1]=0
print(a)   # [1, 0, [3, 5], 4]
print(b)   # [1, 2, [3, 5], 4]
Run Code Online (Sandbox Code Playgroud)

示例2:

c=[1,2,[3,5],4]
d=list(c)
c[2][0]=0
print(c)   # [1, 2, [0, 5], 4]
print(d)   # [1, 2, [0, 5], 4]
Run Code Online (Sandbox Code Playgroud)

MSe*_*ert 7

浅拷贝意味着您得到一个新列表,但元素是相同的。因此两个列表具有相同的第一个元素、第二个元素等。

如果您在浅复制列表中添加、删除或替换某个值,则该更改不会反映在原始列表中(反之亦然),因为浅复制创建了一个新列表。但是,如果您更改任一列表中的元素,则更改在两个列表中都可见,因为两个列表都引用相同的项目。因此,内部列表实际上在新列表和旧列表之间共享,如果您更改它,则该更改在两者中都可见。

请注意,您实际上没有更改两个示例中的元素,您替换了第一个示例中列表的元素,而在第二个示例中,您替换了列表中元素的元素。

我目前经常使用 graphviz,所以让我添加一些图像来说明这一点:

浅拷贝意味着你得到一个新列表,但列表中存储的对象是相同的:

在此输入图像描述

如果您替换其中任何一个元素,相应的元素将仅引用一个新项目(您的第一个示例)。看看一个列表如何引用两个而另一个列表如何引用零:

在此输入图像描述

虽然对引用项的更改将更改该项,并且引用该项的每个对象都将看到更改:

在此输入图像描述