Python 配列の要素にforでカウントアップしたdict型を入れる

概要


配列の要素にforでカウントアップしたdict型を入れる

問題

最初は下記のソースではカウントアップさせた最後のdict型のみしか出力されなかった。

import json

def lambda_handler(event, context):
    # TODO implement
    array_list = []
    sample_dict = {}
    sample_dict["Name"] = "Yamada"
    sample_dict["Address"] = "Tokyo"
    for nm in [1,2,3,4]:
        sample_dict["No"] = nm
        array_list.append(sample_dict)
    
    return array_list

下記、出力結果。Noの要素がすべて4になってしまってる。

[
  {
    "Name": "Yamada",
    "Address": "Tokyo",
    "No": 4
  },
  {
    "Name": "Yamada",
    "Address": "Tokyo",
    "No": 4
  },
  {
    "Name": "Yamada",
    "Address": "Tokyo",
    "No": 4
  },
  {
    "Name": "Yamada",
    "Address": "Tokyo",
    "No": 4
  }
]

解決策

下記のようにappendで渡すdict型にcopy()を使用すると解決しました。

import json

def lambda_handler(event, context):
    # TODO implement
    array_list = []
    sample_dict = {}
    sample_dict["Name"] = "Yamada"
    sample_dict["Address"] = "Tokyo"
    for nm in [1,2,3,4]:
        sample_dict["No"] = nm
        array_list.append(sample_dict.copy())
    
    return array_list

下記、出力結果

[
  {
    "Name": "Yamada",
    "Address": "Tokyo",
    "No": 1
  },
  {
    "Name": "Yamada",
    "Address": "Tokyo",
    "No": 2
  },
  {
    "Name": "Yamada",
    "Address": "Tokyo",
    "No": 3
  },
  {
    "Name": "Yamada",
    "Address": "Tokyo",
    "No": 4
  }
]

参照


リストのコピーでハマった話