0

次のフラストレーションで 1 時間過ごしましたが、

a)他の誰かが同じ問題を抱えている場合に備えて投稿したかった、およびb)この動作の根底にあるものに非常に興味があります.

$ e = [{}]*6
$ e
[{}, {}, {}, {}, {}, {}]
$ e[0]['green'] = 'blue'
$ e
[{'green': 'blue'}, {'green': 'blue'}, {'green': 'blue'}, {'green': 'blue'}, {'green': 'blue'}, {'green': 'blue'}]
$ e = [{}, {}, {}, {}, {}, {}]
$ e
[{}, {}, {}, {}, {}, {}]
$ e[0]['green'] = 'blue'
$ e
[{'green': 'blue'}, {}, {}, {}, {}, {}]

基本的に、問題は、辞書のリストが [{}]*int で初期化され、リスト内のインデックスによって単一の辞書を変更しようとすると、すべての辞書が変更されることです。一方、明示的に初期化する

ありがとう

4

2 に答える 2

4

あなたは同じdict6回入れているからです。[{}]*6元のdictをコピー/ディープコピーするのではなく、それへの参照のみをコピーします。6 つの個別の dict が必要な場合は、ループ/リスト内包表記を使用します。

e = [{} for i in range(6)] 

python docの詳細な説明を参照してください

于 2012-04-26T21:12:02.197 に答える
1

答えは:可変性です。そして、それは奇妙ではありません。

最初のケース:

>>> e = [{}]*6

6 回繰り返される 1 つの辞書からリストを作成します。要素の 1 つを変更すると、他の要素も変更されます (実際には、これらの「他の」要素は同じ要素であるため、少なくともそのように見えます)。

2 番目のケースでは:

>>> e = [{}, {}, {}, {}, {}, {}]

6 つの異なる辞書からリストを作成したため、1 つを変更しても他の辞書には影響しません。

于 2012-04-26T21:14:57.690 に答える