【问题标题】:How to calculate/update values for a nested list in python?如何计算/更新python中嵌套列表的值?
【发布时间】:2021-09-14 23:34:04
【问题描述】:

我真的陷入了一个问题,我完全不明白为什么输出是它的样子,而不是我所期望的。我基本上想计算仅用零初始化的嵌套列表的元素的值。这是我的问题的简单形式的代码:

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。

【问题讨论】:

标签: python nested-lists nested-for-loop


【解决方案1】:

那是因为列表的浅拷贝。 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]]

【讨论】:

    【解决方案2】:

    您应该在开始第二个内循环时重新初始化元素。 就像这样,aa[i][j]=0,就在变量 j 的 for 迭代开始之后。 然后你会得到你预期的结果。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-03
        • 1970-01-01
        • 2021-12-24
        • 2018-04-10
        相关资源
        最近更新 更多