3

私の問題は、辞書をリストに更新するときです。

入力:

>>> res=[]
>>> my_inital_dict={'aa':1,'bb':1}
>>> for i in range(4):
...     my_initial_dict.update({'aa':i+4})
...     print my_initial_dict
...     res.append(my_initial_dict)

私が得た出力:

{'aa': 4, 'bb': 1}
{'aa': 5, 'bb': 1}
{'aa': 6, 'bb': 1}
{'aa': 7, 'bb': 1}
>>> res
[{'aa': 7, 'bb': 1}, {'aa': 7, 'bb': 1}, {'aa': 7, 'bb': 1}, {'aa': 7, 'bb': 1}]

my_initial_dictループ内で印刷すると、正しい値が得られます。しかし、結果のリストを印刷すると、同じ辞書が4回繰り返された辞書のリストが表示されます。誰かがここで何が起こっているのか説明できますか?

4

4 に答える 4

4

前に述べたように、 res リスト内のすべての項目が同じ objectを参照しています。

あなた: この変更可能なオブジェクトをリストに追加し、変更して、もう一度追加してください。

コンピューター: リストにオブジェクトを追加して、同じオブジェクトをリストに追加します。これがあなたのリストで、同じ 2 つのオブジェクトが含まれています。

これは別の言い方です。最初にオブジェクトを使用してリストを作成し、次にオブジェクトのリストを表示します。この場合は同じオブジェクトのリストです。したがって、リストの各位置にある状態ではなく、そのオブジェクトの最新の状態が表示されます。コピーを作成しない限り、追加したもの。

楽しみのためだけに、それを行う他の方法。

copy() および update() を使用した、ネストされた内包表記またはラムダによるマップ

my_inital_dict={'aa':1,'bb':1}
res = [x[1] for x in [(my_inital_dict.update({'aa':i+4}),
       my_inital_dict.copy()) for i in range(4)]]

-また-

res = map(lambda i: my_inital_dict.update({'aa':i+4}) or my_inital_dict.copy(),
      range(4))
于 2013-07-26T17:50:12.477 に答える
2

すべてのリスト項目は、同じディクショナリ オブジェクトを参照しています。コピーを作成します。

res = []
my_initial_dict = {'aa':1,'bb':1}
for i in range(4):
    d = my_initial_dict.copy()
    d['aa'] = i + 4
    print d
    res.append(d)
print res
于 2013-07-26T14:08:29.003 に答える
2

毎回ループ内の res に辞書を追加しているため、繰り返しが表示されます。毎回同じ辞書を更新しているため、それらはすべて同じ値を持っています

res=[]
my_inital_dict={'aa':1,'bb':1}
updates = [my_initial_dict]
for i in range(4):
   updates.append({'aa':i+4})
   my_initial_dict.update({'aa':i+4})
   res = my_initial_dict
print updates
于 2013-07-26T14:07:09.000 に答える