a = b和a = b [:]有什么区别?

时间:2020-05-14 12:42:21

标签: python python-3.x copy

只是试图了解浅表副本之间的区别。 说我有一个清单:

lst = [1,2,3] 
a = lst
b = lst[:]

有人可以解释一下这些浅拷贝方法之间的区别吗?

2 个答案:

答案 0 :(得分:3)

ab之间的区别在于,a是对lst的另一种引用,而b是对新列表的引用。您可以通过修改a来查看。结果是lst被修改了(因为alst引用了同一个对象),但是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]