前提・実現したいこと
Python で辞書を作成するプログラムを作成しています。key は整数、value はリストのリストです。
実行中は、なんのエラーメッセージも出されず、表面的には正常に実行されています。
無関係でしょうが、ちなみに環境(IDE)は PyScripter です。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
Python 3
ソースコード(抜粋)
(global)
memos = defaultdict(list)
(while ループの中)
list = []
while ..
...
print('list:', list)
key = 0
list_res = list.copy()
list_res_bak = [] ##
for val in list:
print('val =', val)
key += val
if not (persons * 1//4 <= key <= persons * 3//4): break
list_res.pop(0)
# list_res_bak = list_res.copy() ##
print('key =', key, ', list_res:', list_res)
print('before append - memos:', memos)
memos[key].append(list_res)
# memos[key].append(list_res_bak) ##
print('after append - memos:', memos)
...
以下2とおりの実行結果(抜粋)を掲げます。
...
OK(6) table: [10, 5, 5, ] ※この出力に対するコードは上のソースにはない
list: [10, 5, 5]
val = 10
key = 10 , list_res: [5, 5]
before append - memos: defaultdict(<class 'list'>, {10: [[10], [8, 2], [7, 3], [6, 4], [6, 2, 2]]})
after append - memos: defaultdict(<class 'list'>, {10: [[10], [8, 2], [7, 3], [6, 4], [6, 2, 2], [5, 5]]})
val = 5
key = 15 , list_res: [5]
before append - memos: defaultdict(<class 'list'>, {10: [[10], [8, 2], [7, 3], [6, 4], [6, 2, 2], [5]]})
after append - memos: defaultdict(<class 'list'>, {10: [[10], [8, 2], [7, 3], [6, 4], [6, 2, 2], [5]], 15: [[5]]})
...
問題は辞書 memos において、最初のほうの append 後の {.. ,[5, 5]]} は正常ですが、次の for の list における append 前では、何故か {.. ,[5]]} と変化しています。
この原因がわからず、苦し紛れに上のソースでリスト list_res_bak を設け、pop() しているリストとmemosにappendしているリストを別物(コピー)にしてみました。(すなわち、上のソースの ## の行を活かしたもの。)結果は、上の部分が次のように正常になりました。
ずいぶん悩みましたが、pop() が絡むバグではないか、と考えますが如何でしょうか。
...
OK(6) table: [10, 5, 5, ]
list: [10, 5, 5]
val = 10
key = 10 , list_res: [5, 5]
before append - memos: defaultdict(<class 'list'>, {10: [[10], [8, 2], [7, 3], [6, 4], [6, 2, 2]]})
after append - memos: defaultdict(<class 'list'>, {10: [[10], [8, 2], [7, 3], [6, 4], [6, 2, 2], [5, 5]]})
val = 5
key = 15 , list_res: [5]
before append - memos: defaultdict(<class 'list'>, {10: [[10], [8, 2], [7, 3], [6, 4], [6, 2, 2], [5, 5]]})
after append - memos: defaultdict(<class 'list'>, {10: [[10], [8, 2], [7, 3], [6, 4], [6, 2, 2], [5, 5]], 15: [[5]]})
...
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答4件
あなたの回答
tips
プレビュー