3

リストのリストのこれら 2 つの宣言の違いは何ですか?

>>> l = [[]]*4
>>> l
[[], [], [], []]
>>> l[1].append(1)
>>> l
[[1], [1], [1], [1]]

>>> m = [[],[],[],[]]
>>> m[1].append(1)
>>> m
[[], [1], [], []]
4

4 に答える 4

12

最初のものは、1 つのリストへの 4 つの参照を作成します --- 同じリストが 4 回繰り返されます。2 つ目は、4 つの個別のリストを作成します。最初のケースでは、1 つのリストに追加すると、それらはすべて同じオブジェクトであるため、すべてのリストに影響します。2 番目のケースでは、各リストは個別のオブジェクトであるため、1 つに追加しても他のリストには影響しません。

于 2012-06-26T16:55:18.210 に答える
4

これにより、明確なアイデアが得られます。lすべてのオブジェクトが同じid()であり、すべて変更可能であるため、それらのいずれかを編集すると、他のオブジェクトも自動的に編集されます。これらはすべて同じオブジェクトへの参照でid=18671936 あり、mすべてが異なるid()ため、すべてそれらは異なるオブジェクトです。

>>> l = [[]]*4
>>> for x in l:
        print(id(x))

18671936 
18671936
18671936
18671936

>>> m=[[],[],[],[]]
>>> for x in m:
        print(id(x))

10022256
18671256
18672496
18631696
于 2012-06-26T17:01:57.047 に答える
3

多分これはそれをより明確にするのに役立ちますか?これは最初の例と同じです:

>>> l1 = []
>>> l2 = [l1]*4
>>> l2
[[], [], [], []]

基本的にここで行っているのは、4 つの項目を含むリストを作成することです。これらの項目はすべて同じリストを参照しています。私のコードでは、そのリストの名前はl1.

以下のコメントでマークが述べたように、これもまったく同じです。

>>> l1 = []
>>> l2 = [l1, l1, l1, l1]
>>> l2
[[], [], [], []]
于 2012-06-26T16:57:00.427 に答える
1

この現象を理解するのに役立つのは、必要なすべてのリストを明示的に作成する必要があるということです。

で空のリストを明示的に作成できます[]。最初の例では、それを 1 回行ったので、リストは 1 つです。2 番目は 4 回実行したので、4 つのリストがあります。

何度も書きたくない場合は、行う[]ことができます

[[] for _ in range(n)]
于 2012-06-26T17:00:22.070 に答える