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
不,你没有。您已将第一个轴切片两次。做了一份副本。和副本没有区别。
我不明白 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
不,你没有。您已将第一个轴切片两次。做了一份副本。和副本没有区别。