在嵌套python列表中对外部维使用切片分配时出现意外结果

时间:2019-01-01 18:50:01

标签: python python-3.x nested-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]]

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

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

5 个答案:

答案 0 :(得分:4)

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]

答案 1 :(得分:1)

您在寻找这个吗?:

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

答案 2 :(得分:1)

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

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

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

您可以这样做以获得所需的结果:

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

答案 3 :(得分:0)

如果您想要的结果是没有理由使用列表切片

  

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

您应该这样做:

  

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

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

答案 4 :(得分:0)

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

我认为这会为您提供帮助