Python 切片嵌套列表的复制行为

Python Copy Behaviour on Sliced Nested Lists

我不明白 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 数组中发现了类似的观察结果。

我想知道为什么会这样?

I have sliced both axes

不,你没有。您已将第一个轴切片两次。做了一份副本。和副本没有区别。