G2J2
@G2J2 (おとます)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonの代入について

Q&A

Closed

解決したいこと

Pythonにて以下の代入を行った際、Zが想定通りの結果にならないことが分かりました。
原因が分からないので教えて欲しいです。
よろしくお願いします。

発生している問題・エラー

入力

H = 5
W = 5
X = [
    [2, 0, 0, 5, 1],
    [1, 0, 3, 0, 0],
    [0, 8, 5, 0, 2],
    [4, 1, 0, 0, 6],
    [0, 9, 2, 7, 0],
]
Q = 2
matrix = [[2, 2, 4, 5], [1, 1, 5, 5]]

Z = [[0] * (W + 1)] * (H + 1)

for i in range(1, H + 1):
    for j in range(1, W + 1):
        Z[i][j] = X[i - 1][j - 1]
print("X:", X)
print("Z:", Z)

出力結果

X: [[2, 0, 0, 5, 1],
    [1, 0, 3, 0, 0],
    [0, 8, 5, 0, 2],
    [4, 1, 0, 0, 6],
    [0, 9, 2, 7, 0]]
Z: [[0, 0, 9, 2, 7, 0],
    [0, 0, 9, 2, 7, 0],
    [0, 0, 9, 2, 7, 0],
    [0, 0, 9, 2, 7, 0],
    [0, 0, 9, 2, 7, 0],
    [0, 0, 9, 2, 7, 0]]

想定していたZ

# Xの上と左が0埋めされた状態
[0, 0, 0, 0, 0, 0],
[0, 2, 0, 0, 5, 1],
[0, 1, 0, 3, 0, 0],
[0, 0, 8, 5, 0, 2],
[0, 4, 1, 0, 0, 6],
[0, 0, 9, 2, 7, 0]]

自分で試したこと

Zの初期化を以下のようにすれば想定通りになりましたが、なぜその書き方で良くなったのかも分かりません。

Z = [ [ 0 ] * (W + 1) for i in range(H + 1) ]

補足

以下の問題を解いているときに遭遇しました。
atcoder上のコードテスト環境とローカルのJupyter環境でも実行しましたが、同様の結果が出力されます。
https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_h

0

1Answer

の「2次元配列(リストのリスト)を初期化する際の注意」を参照ください。

1Like

Comments

  1. @G2J2

    Questioner

    @imagou
    ありがとうございます。解決しました。

Your answer might help someone💌