【问题标题】:More explanation on difference between shallow and deep copy关于浅拷贝和深拷贝的区别的更多解释
【发布时间】:2018-10-25 00:39:19
【问题描述】:

请帮助我理解 Example#1-B 的结果:

示例#1-A:

ref=[3,5,9]
c=ref[:]
c[1]=0
# c equals to [3,0,9], and ref equals to [3, 5, 9]

示例#1-B:

ref=[[1,2],[3,4]]
c=ref[:]
c[0][1]=0
# c equals to [[1, 0], [3, 4]], and ref equals to [[1, 0], [3, 4]]

示例#2-A:

ref=[3,5,9]
c=copy.deepcopy(ref)
c[1]=0
# c equals to [3, 0, 9], and ref equals to [3, 5, 9]

示例#2-B:

ref=[[1,2],[3,4]]
c=copy.deepcopy(ref)
c[0][1]=0
# c equals to [[1,0],[3,4]], and ref equals to [[1,2],[3,4]]

【问题讨论】:

标签: python python-3.x copy deep-copy


【解决方案1】:

列表是可变的。 示例 1-B 中的行 c=ref[:] 正在复制新列表 cref 的子列表的引用 因此,您可以从 refc 访问相同的子列表

【讨论】:

  • 示例 1-A 中的行 c=ref[:] 也复制了列表 ref 的引用。然后,应该将 ref 更改为 [3,0,9] 而不是 [3,5,9]。事实并非如此。我在这里错过了什么吗?
  • 因为整数是不可变的。在情况 1-A 中,c=ref[:] 创建一个新列表,其中包含(不可变的)副本,而不是(可变的)引用。 copy.deepcopy 方法用于创建可变对象的副本而不是对它们的引用(这解释了 1-B 和 2-B 之间的区别)。希望能更清楚一点。
猜你喜欢
  • 1970-01-01
  • 2016-05-07
  • 2010-09-16
  • 2012-04-12
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
相关资源
最近更新 更多