1

重複の可能性:
1つとして機能する2つの別々のPythonリスト

このコードはリストの辞書を作成し、キーはにありますusens。リストは0sでいっぱいです

usens = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 110, 111, 112, 113, 114,
         115, 116, 117, 118, 119, 302, 303, 306, 307, 308, 370, 371, 500,
         501, 1000, 1010, 1020, 1100, 1200, 1201, 1202, 2000, 2001, 2002
         ]
empty = [[0]*length]*len(usens)
data = dict(zip(usens, empty))
pprint.pprint(data, indent=5)

data[0][0] += 1
pprint.pprint(data, indent=5)

最初のきれいな印刷物は期待されたものを返します(宣伝文句は削除されました):

{0: [0, 0, 0, 0, 0],
 1: [0, 0, 0, 0, 0],
 2: [0, 0, 0, 0, 0],
 3: [0, 0, 0, 0, 0],
 4: [0, 0, 0, 0, 0],
 5: [0, 0, 0, 0, 0],
 .....
 2001: [0, 0, 0, 0, 0],
 2002: [0, 0, 0, 0, 0]}

次に、これを行います。 、(インデックスの)最初のリストがで始まることをdata[0][0] += 1期待しますが、他に変更するものはありません。01

ただし、すべてのリストが変更されています。

{0: [1, 0, 0, 0, 0],
 1: [1, 0, 0, 0, 0],
 2: [1, 0, 0, 0, 0],
 3: [1, 0, 0, 0, 0],
 4: [1, 0, 0, 0, 0],
 .....
 2001: [1, 0, 0, 0, 0],
 2002: [1, 0, 0, 0, 0]}

なぜ、そしてどうすれば1つのリストだけが変更されるようにできますか?

4

2 に答える 2

3

empty = [[0]*length]*len(usens)len(usens)同じ内容のリストとは異なり、同じリストのコピーが作成されlen(usens)ます。

試してみてくださいempty = [[0]*length for i in range(len(usens))]

于 2012-12-07T20:40:52.357 に答える
1

を使用*するとコピーが作成されます。不変のスカラーをコピーし[0]ているので、問題ありません。ただし、外部*は同じリストのコピーを作成します(つまり、参照をコピーします)。次のようなものを使用できます。

empty = [0]*5
data = {n:list(empty) for n in usens}

(dictの理解)リストを作成します(Python 2.7以降を使用している場合)。を使用listするとコピーが作成されます。

于 2012-12-07T20:48:13.580 に答える