在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]]。
答案 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
我认为这会为您提供帮助