如何 python 中嵌套列表的 calculate/update 值?
How to calculate/update values for a nested list in python?
我真的遇到了一个问题,我完全不明白为什么输出是这样的,而不是我所期望的。我基本上想计算仅用零初始化的嵌套列表的元素的值。这是我的问题的简单形式的代码:
aa = [[0] * 2] * 2
for i in range(2):
for j in range(2):
for k in range(0, 10):
aa[i][j] += k
我预计“aa”的输出为:[[45, 45], [45, 45]]。
但是输出是:[[90, 90], [90, 90]]
怎么可能?任何解释都会有所帮助。调试后我看到 Python 总是将 k 添加到列表中的两个列表中,尽管 i 当前为 0.
那是因为list的浅拷贝。 aa = [[0] * 2] * 2
创建浅拷贝,尝试 aa = [[0]*2 for i in range(2)]
aa = [[0]*2]*2
print(aa[0]) #[0,0]
print(aa[1]) # [0,0]
aa[0][0] = 2
aa[0][1] = 2
print(aa[0]) #[2,2]
print(aa[1]) # [2,2] !!
# +-------+-------+
# | aa[0] | aa[1] |
# +-------+-------+
# | |
# | |
# \ /
# [0 , 0]
# Both referring to the same list
# So whatever operation you do in aa[0] will reflect in aa[1] and vice versa
# Because effectively they are pointing to same list
# id(aa[0]) == id(aa[1]) ---> True
aa = [[0]*2 for i in range(2)]
for i in range(2):
for j in range(2):
for k in range(0, 10):
aa[i][j] += k
[[45, 45], [45, 45]]
您应该在开始第二个内循环时重新初始化该元素。
像这样,aa[i][j]=0
,就在变量 j 的 for 迭代开始之后。
然后你就会得到你想要的结果。
K 被添加到两个列表中,因为您对列表 aa = [[0] * 2] * 2
的元素使用了乘法。通过乘以 2,您还复制了引用,这就是为什么您在两个列表中得到相同结果的原因。
您可以使用列表理解来避免这个问题:
aa = [[0]*2 for i in range(2)] # [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
for k in range(0, 10):
aa[i][j] += k # [[45, 45], [45, 45]]
我真的遇到了一个问题,我完全不明白为什么输出是这样的,而不是我所期望的。我基本上想计算仅用零初始化的嵌套列表的元素的值。这是我的问题的简单形式的代码:
aa = [[0] * 2] * 2
for i in range(2):
for j in range(2):
for k in range(0, 10):
aa[i][j] += k
我预计“aa”的输出为:[[45, 45], [45, 45]]。
但是输出是:[[90, 90], [90, 90]]
怎么可能?任何解释都会有所帮助。调试后我看到 Python 总是将 k 添加到列表中的两个列表中,尽管 i 当前为 0.
那是因为list的浅拷贝。 aa = [[0] * 2] * 2
创建浅拷贝,尝试 aa = [[0]*2 for i in range(2)]
aa = [[0]*2]*2
print(aa[0]) #[0,0]
print(aa[1]) # [0,0]
aa[0][0] = 2
aa[0][1] = 2
print(aa[0]) #[2,2]
print(aa[1]) # [2,2] !!
# +-------+-------+
# | aa[0] | aa[1] |
# +-------+-------+
# | |
# | |
# \ /
# [0 , 0]
# Both referring to the same list
# So whatever operation you do in aa[0] will reflect in aa[1] and vice versa
# Because effectively they are pointing to same list
# id(aa[0]) == id(aa[1]) ---> True
aa = [[0]*2 for i in range(2)]
for i in range(2):
for j in range(2):
for k in range(0, 10):
aa[i][j] += k
[[45, 45], [45, 45]]
您应该在开始第二个内循环时重新初始化该元素。
像这样,aa[i][j]=0
,就在变量 j 的 for 迭代开始之后。
然后你就会得到你想要的结果。
K 被添加到两个列表中,因为您对列表 aa = [[0] * 2] * 2
的元素使用了乘法。通过乘以 2,您还复制了引用,这就是为什么您在两个列表中得到相同结果的原因。
您可以使用列表理解来避免这个问题:
aa = [[0]*2 for i in range(2)] # [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
for k in range(0, 10):
aa[i][j] += k # [[45, 45], [45, 45]]