3

プロジェクトのニーズに合わせて、いくつかのデータを反復し、必要な値を事前に作成された辞書に追加します。

これが私の質問を表すコードの例です。

class Parser:
    def __init__(self):
        self.records = [['value1','value2','value3'], 
                        ['value4','value5','value6'],
                        ['value7','value8','value9']]
    def get_parsed(self):
        parsed = []
        dic = {'key1': '',
               'key2': '',
               'key3': '',
               }
        for i in self.records:
            dic['key1'] = i[0]
            dic['key2'] = i[1]
            dic['key3'] = i[2]
            parsed.append(dic)
        return parsed

私が期待するのは、次のような辞書のリストです。

[{'key1':'value1','key2':'value2','key3':'value3'},
 {'key1':'value4','key2':'value5','key3':'value6'},
 {'key1':'value7','key2':'value8','key3':'value9'}]

しかし、私が得ているのは次のとおりです。

[{'key1':'value1','key2':'value2','key3':'value3'},
 {'key1':'value1','key2':'value2','key3':'value3'},
 {'key1':'value1','key2':'value2','key3':'value3'}]

ただし、辞書の初期化を「for」ループに移動すると、目的の結果が得られますが、なぜそれが起こっているのかわかりませんか?

編集:問題は、「なぜこのようになるのか」ということです。ipythonでいくつかのテストを行いましたが、それが私が持っているものです:

In [1]: d = {'a':'','b':'','c':''}

In [2]: d
Out[2]: {'a': '', 'b': '', 'c': ''}

In [3]: d['a'] = 'value'

In [4]: d['b'] = 'other_value'

In [5]: d['c'] = 'third_value'

In [6]: d
Out[6]: {'a': 'value', 'b': 'other_value', 'c': 'third_value'}

In [7]: d['a'] = 'inserting new value'

In [8]: d
Out[8]: {'a': 'inserting new value', 'b': 'other_value', 'c': 'third_value'}

したがって、キーの値は更新される可能性があり、変更される可能性があります.FORループで発生しないのはなぜですか?

4

2 に答える 2

5

同じ辞書を 3 回変更してリストに挿入しています。ループの反復ごとに新しい辞書を作成します。

for i in self.records:
    dic = { 'key1': i[0], 'key2': i[1], 'key3': i[2] }
    parsed.append(dic)
于 2012-10-05T19:50:09.873 に答える
5

yourdicはループの外側で作成されるため、作成する辞書は 1 つだけです。3 つの異なる dict が必要な場合は、3 つの異なる dict を作成する必要があるため、最初の作成をdicループ内に移動します。

更新された質問に答えるために、問題は、それぞれparsed.append(dic)に新しい dict を追加していると思いますが、同じ dict を 3 回追加しているだけです。 Append辞書をコピーしません。したがって、その辞書を変更するたびに、すべてparse同じ辞書であるため、すべての辞書が変更を示します。2 番目のコード例のこのバージョンは、よりわかりやすいかもしれません。

>>> d = {'a': '', 'b': '', 'c': ''}
>>> stuff = []
>>> stuff.append(d)
>>> print stuff
[{'a': '', 'c': '', 'b': ''}]
>>> d['a'] = 'other'
>>> print stuff
[{'a': 'other', 'c': '', 'b': ''}]
>>> stuff.append(d)
>>> print stuff
[{'a': 'other', 'c': '', 'b': ''}, {'a': 'other', 'c': '', 'b': ''}]
>>> d['a'] = 'yet another'
>>> print stuff
[{'a': 'yet another', 'c': '', 'b': ''}, {'a': 'yet another', 'c': '', 'b': ''}]

辞書を変更すると実際に値が変更されるという点で「機能する」ことに注意してください。ただし、それにもかかわらず、リストには同じ辞書が複数回含まれているため、以前に行った変更はすべて上書きされます。最終的に、リストには最後のバージョンの dict のみが含まれます。これは、以前のすべての変更がリスト内のすべての dict で上書きされたためです。

于 2012-10-05T19:50:45.977 に答える