如何在不保存迭代的最后值的情况下替换python嵌套列表中的值



我试图在列表的i-th列表中添加/替换一个i元素,但是,只保存了最后一次迭代。理解为什么会发生这种情况以及这将是什么解决方法,这将是很高兴的。我对看起来像这样的输出感兴趣:[[[0], [], [], []], [[1], [], [], []], [[2], [], [], []], [[3], [], [], []]],但我得到了:[[[3], [], [], []], [[3], [], [], []], [[3], [], [], []], [[3], [], [], []]]

matrix = [ [ [] * 4] * 4] * 4
print('pre_matrix=',matrix)
for m in range(len(a) + 1):
    matrix[m][0] = [m]
    print('m={}, matrix[m]={}'.format(m, matrix[m]))
print('post_matrix=', matrix)
# This is what the response looks like:
# pre_matrix= [[[], [], [], []], 
# [[], [], [], []], 
# [[], [], [], []], 
# [[], [], [], []]]
#
# m=0, matrix[m]=[[0], [], [], []]
# m=1, matrix[m]=[[1], [], [], []]
# m=2, matrix[m]=[[2], [], [], []]
# m=3, matrix[m]=[[3], [], [], []]
#
# post_matrix= [[[3], [], [], []], 
# [[3], [], [], []], 
# [[3], [], [], []], 
# [[3], [], [], []]]

做类似:

的事情
matrix = [ [ [] * 4] * 4] * 4

您实际上并未使用每个乘法创建新列表。相反,您正在创建许多对同一基础列表的引用。当我们简化示例时,可以看到这一点:

matrix = [[0, 0, 0]] * 3 # <- Wrong!
matrix[0][0] = 1
print(matrix)
# [[1, 0, 0], [1, 0, 0], [1, 0, 0]]

要解决此问题,请使用列表综合来适当地创建一个新列表:

matrix = [[[] for _ in range(4)] for _ in range(4)]

在您的代码中(用4替换len(a) + 1(:

matrix = [[[] for _ in range(4)] for _ in range(4)]
print('pre_matrix=',matrix)
for m in range(4):
    matrix[m][0] = [m]
    print('m={}, matrix[m]={}'.format(m, matrix[m]))
print('post_matrix=', matrix)

输出:

pre_matrix= [[[], [], [], []], [[], [], [], []], [[], [], [], []], [[], [], [], []]]
m=0, matrix[m]=[[0], [], [], []]
m=1, matrix[m]=[[1], [], [], []]
m=2, matrix[m]=[[2], [], [], []]
m=3, matrix[m]=[[3], [], [], []]
post_matrix= [[[0], [], [], []], [[1], [], [], []], [[2], [], [], []], [[3], [], [], []]]

最新更新