0

文字列のリストがあり、リスト内の各文字列を辞書に保存して別の関数に送信したいと思います。これまでのところ、次のようになります。

list = ['75001', '75002', '75003']
params = {}
for elt in list:
    params['elt'] = elt
    ...
    foo(params)

しかし、問題は、値ではなくeltへの参照を格納していることです。そのため、関数呼び出しでは、常にリストの最後の要素があります。

params['elt'] = '75003'

参照ではなく値のみを保存するにはどうすればよいですか?

4

4 に答える 4

2
list = ['75001', '75002', '75003']
params = {}
for elt in list:
    params[elt] = elt
    ...
    foo(params)

内の引用符を削除するだけeltですparams['elt']。現在行っているのは、キーの値を繰り返し変更することです'elt'

ただし、毎回新しい辞書が必要な場合は、次のようにすることができます。

list = ['75001', '75002', '75003']
for elt in list:
    foo({'elt': elt})
于 2012-09-19T14:51:55.653 に答える
2

問題は、すべての関数が同じ辞書を取得することです。代わりにこれを試してください:

list = ['75001', '75002', '75003']
for elt in list:
    params = {}
    params['elt'] = elt
    ...
    foo(params)

これで、を呼び出すたびfoo()に新しいコンテナが取得され、お互いを見ることができなくなります。

于 2012-09-19T14:53:22.890 に答える
2

fooに渡した後も変更されないdictが必要な場合は、そのdictのコピーを作成する必要があります。

params = {}
for elt in list:
    params['elt'] = elt
    ...
    foo(params.copy())

これで、ループの後半でさらに変更しても、に送信しparamsたコピーには影響しません。paramsfoo

paramsこれは、ループの外側で最初に作成できるという点で、AaronDigullaの回答とは異なります。これは、paramsがコードのはるか上で宣言されていて、それをループに移動したくない場合に役立ちます。または、最初のインスタンス化に費用がかかり、それを2回以上実行したくない場合。

于 2012-09-19T15:02:05.677 に答える
1

私はあなたがこのようなものが欲しいと思います:

zip_codes = ['75001', '75002', '75003']
for zip_code in zip_codes:
    params = {}
    params['zip code'] = zip_code
    ...
    foo(params)

これにより、ループを通過するたびに新しい空の辞書が作成され、呼び出す前にリストから値が追加されますがfoo()、ループを通過するたびに同じキーに割り当てることが確実でない限り、実際には必要ありません。別の方法は、ループの外に戻し、ループparams.clear()の先頭で呼び出すことです。もちろんfoo()、必要に応じて呼び出す前に、他のキーと対応する検索情報を追加することもできます。

于 2012-09-19T15:06:24.910 に答える