我试图在列表的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], [], [], []]]