在嵌套 python 列表的外部维度上使用切片赋值时出现意外结果

Unexpected result when using slice assignment on outer dimension in nested python lists

在 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]]

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

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

你在找这个吗?:

x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
y=[[l[0],17,l[2]] for l in x]
print(y)

结果是:

[[1, 17, 3], [4, 17, 6], [7, 17, 9]]

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]

id(x)id(x[:])不同,因为x[:]创建了x的浅拷贝。所以,当你写

x[:][0][1] = 17

您正在创建 x 的新浅表副本,并将第一个子列表的第一个元素修改为 17。但是,新结果 result 没有引用,因此无法访问它的内容.

您可以这样做以获得您想要的结果:

a = x[:] # creates a shallow copy of x
a[0][1] = 17
print(x, id(x))
print(a, id(a))

输出:

[[1, 17, 3], [4, 5, 6], [7, 8, 9]] 139933444652552
[[1, 17, 3], [4, 5, 6], [7, 8, 9]] 139933416357064

如果您想要的结果是

,则没有理由使用列表切片

x = [[1, 2, 3], [17, 17, 17], [7, 8, 9]]

你应该这样做:

x[1] = [17,17,17]

当您使用切片时,它会创建一个等于 x 的新对象,因此它不会保存在 x 变量上。

list1 = [[1,2,3], [4,5,6], [7,8,9]]
x, y = len(list1)-1, 0
while y <= x:
    print(list1[y][1], end=" ")
    y = y+1

输出:

2 5 8

我想这对你有帮助