只是试图了解浅表副本之间的区别。 说我有一个清单:
lst = [1,2,3]
a = lst
b = lst[:]
有人可以解释一下这些浅拷贝方法之间的区别吗?
答案 0 :(得分:3)
a
和b
之间的区别在于,a
是对lst
的另一种引用,而b
是对新列表的引用。您可以通过修改a
来查看。结果是lst
被修改了(因为a
和lst
引用了同一个对象),但是b
没有被修改。
>>> lst = [1,2,3]
>>> a = lst
>>> b = lst[:]
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> a[0] = 3
>>> a
[3, 2, 3]
>>> b
[1, 2, 3]
>>> lst
[3, 2, 3]
但是,尽管运算符[:]
创建了一个副本而不是引用,但是它仍然创建了一个浅副本,这意味着该副本只有一层深。特别是,这意味着,如果列表中的元素是更复杂的对象,则这些对象将不会被复制,而只是对新列表中相同对象的引用。通过尝试使用列表列表进行相同的操作,可以看出这一点:
>>> list2
[[0, 1], [2, 3]]
>>> list3 = list2
>>> list4 = list2[:]
>>> list3
[[0, 1], [2, 3]]
>>> list4
[[0, 1], [2, 3]]
>>> list4[0][0] = 2
>>> list3
[[2, 1], [2, 3]]
>>> list4
[[2, 1], [2, 3]]
请注意,修改列表list4
的元素 也会修改list3
。这是因为尽管它们是不同的列表,但是它们的前两个元素都引用相同的列表。
答案 1 :(得分:2)
这里是一个简单的例子来显示差异。基本上,a=lst
是从a
到列表lst
的指针,因此,当您随后修改列表a
时,列表lst
会被同样地修改。 a=lst[:]
是列表lst
的副本。因此,a
的后续修改对列表lst
无效。
>>> a=[1,2,3]
>>> b=a
>>> b[1]='x'
>>> b
[1, 'x', 3]
>>> a
[1, 'x', 3]
>>> a=[1,2,3]
>>> c=a[:]
>>> c[1]='x'
>>> a
[1, 2, 3]
>>> c
[1, 'x', 3]