【发布时间】: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