【问题标题】:What is the difference between a = b and a = b[:]? [duplicate]a = b 和 a = b[:] 有什么区别? [复制]
【发布时间】:2020-05-14 12:42:21
【问题描述】:

只是想了解浅拷贝之间的区别。 假设我有一个清单:

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

谁能解释一下这些浅拷贝方法之间的区别。

【问题讨论】:

  • a = lst 会将lst 的引用分配给ab = lst[:] 这将创建新列表。更改 a 更改 lst 但更改 b 不会影响 lst
  • 这些不是浅拷贝方法。只有lst[:] 是浅拷贝。执行a = lst 只是将a 绑定到与lst 相同的列表。没有复制

标签: python python-3.x copy


【解决方案1】:

这里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。这是因为虽然它们是不同的列表,但它们的第一个元素都引用同一个列表。

【讨论】:

  • 感谢分层。因此,如果我想在不影响原始 list2 和 list3 的情况下更改内容,我需要为 list4 做一个 deepcopy?
  • @td1 没错!
【解决方案2】:

这里有一个简单的例子来说明区别。基本上,a=lst 是从a 到列表lst 的指针,因此当您随后修改列表a 时,列表lst 被同样修改。 a=lst[:] 是列表 lst 的副本。所以后续修改alst列表没有影响。

>>> 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]

【讨论】:

  • 谢谢!欣赏演示
猜你喜欢
  • 2013-06-25
  • 2019-01-19
  • 2018-06-27
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 2020-04-02
  • 2017-04-06
  • 1970-01-01
相关资源
最近更新 更多