首页 > 解决方案 > 在嵌套 python 列表中对外部维度使用切片分配时出现意外结果

问题描述

在 python 3.7.2 中使用以下代码时,分配将被静默忽略。这是预期的结果吗?

>>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x[:][1]=17
>>> x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

有没有更好的方法使用切片来实现将第二列替换为 17 的预期结果?顺便说一句,当使用 [17, 17, 17] 匹配维度时,我得到了相同的结果。

编辑:只是为了避免一些混乱。预期的结果是 [[1, 17, 3], [4, 17, 6], [7, 17, 9]]。

标签: pythonpython-3.xnested-lists

解决方案


x[:]创建原始列表的副本,并在适当位置修改该新列表。
但是,这个创建的列表是不可访问的(因为没有引用它)。如果你想获得第二个子列表,[17,17,17]x[0] = [17 for _ in x[0]]

但如果你想让它公正[17],那么 x[0] = [17]

编辑:好的,看起来我有点误解了这个问题,看起来你想把它当作一种矩阵。对于常规的 python 列表和嵌套列表,没有这样的语法糖,你必须创建一个 for 循环:

for sublist in x:
    sublist[1] = 17

使用列表理解,您需要创建一个副本,这首先是 IMO 不需要的。但如果你想要那个

copied_and_modified_x = [[sublist[0], 17, sublist[2]] for sublist in x]


推荐阅读