python3の二次元配列リストの作り方で、混乱しています。

```

    a = [[0]*3 for i in range(4)]
    b = [[0]*3]*4
    
    for i in range(4):
      for j in range(3):
        a[i][j] = f'{i}_{j}'
        b[i][j] = f'{i}_{j}'
    
```

という二次元配列の作り方の違いで、以下のように結果が違ってしまいます。

aのリスト内包表記の場合は、

```

    [['0_0', '0_1', '0_2'], 
     ['1_0', '1_1', '1_2'], 
     ['2_0', '2_1', '2_2'],
     ['3_0', '3_1', '3_2']]
    
```

bのリストを掛け算した場合は、

```

    [['3_0', '3_1', '3_2'], 
     ['3_0', '3_1', '3_2'], 
     ['3_0', '3_1', '3_2'], 
     ['3_0', '3_1', '3_2']]
    
```

この出力結果の違いはどのように理解すればよいのでしょうか
CC BY-SA 4.0
2022-07-12T06:09:03.637
89926
2022-07-16T09:51:54.333
2022-07-16T09:51:54.333
53494
53494
question
python python3
python3で空の多重リストを作成するとき、一次元リストを掛け算することについて
aは別のリスト、bは同じリストを参照しています（metropolisさん, payanecoさんがコメント欄に書いてくれているとおり）。

以下の図は [Python
Tutor](https://pythontutor.com/render.html#code=a%20%3D%20%5B%5B0%5D*3%20for%20i%20in%20range%284%29%5D%0Ab%20%3D%20%5B%5B0%5D*3%5D*4%0A%0Afor%20i%20in%20range%284%29%3A%0A%20%20for%20j%20in%20range%283%29%3A%0A%20%20%20%20a%5Bi%5D%5Bj%5D%20%3D%20f%27%7Bi%7D_%7Bj%7D%27%0A%20%20%20%20b%5Bi%5D%5Bj%5D%20%3D%20f%27%7Bi%7D_%7Bj%7D%27&cumulative=false&curInstr=9&heapPrimitives=nevernest&mode=display&origin=opt-
frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false)
で可視化して分かりやすくしたものです。

[![aは別のリスト、bは同じリストを参照している](https://i.stack.imgur.com/84Gqd.png)](https://i.stack.imgur.com/84Gqd.png)
CC BY-SA 4.0
2022-07-14T00:41:45.603
89963
2022-07-14T00:41:45.603
806
89926
answer