【问题标题】:Python Copy Behaviour on Sliced Nested Lists切片嵌套列表上的 Python 复制行为
【发布时间】:2021-11-11 08:06:01
【问题描述】:

我不理解切片时 Python 中嵌套列表的复制行为。我知道如果我想克隆所有内容,我可以使用copy.deepcopy(),但我在这里询问更多关于语言的设计,而不是解决问题。

这是有道理的,因为在切片期间会复制每个元素:

foo = [0, 0, 0]
bar = foo[:]
bar[0] = -1
print(foo) # [0, 0, 0]

这也是有道理的,因为切片第零个索引会创建一个新列表,其中填充了对 foo 的子列表的引用(类似于浅拷贝):

foo = [[0], [0], [0]]
bar = foo[:]
bar[0][0] = -1
print(foo) # [[-1], [0], [0]]

然而,这并不遵循上面的模式:

foo = [[0], [0], [0]]
bar = foo[:][:]
bar[0][0] = -1
print(foo) # [[-1], [0], [0]]

在上面的示例中,我会期望输出[[0], [0], [0]],因为我已经对两个轴进行了切片,因此期望子列表中的元素也会被复制。我在 numpy 数组中发现了类似的观察结果。

我想知道为什么会这样?

【问题讨论】:

  • 最后两个代码 sn-ps 没有什么不同,除了 foo[:][:] 制作副本的副本(并删除中间副本)。
  • 我在 numpy 数组中发现了类似的观察结果。 然后请提供相关示例,显示您观察到的 numpy.array 行为

标签: python list nested copy slice


【解决方案1】:

我已经切割了两个轴

不,你没有。您已经对第一个轴进行了两次切片。复制了一份。和副本没什么区别。

【讨论】:

  • 啊,是的。我错误地认为foo[:][:] 是一种特殊语法,它覆盖了字面解释,即(foo[:])[:]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2011-02-02
相关资源
最近更新 更多