AnDeriensのブログ

個人的なブログです

Pythonの二次元リストを作る際に気をつけたいこと

Pythonでリストをつくるときは乗算をつかって作ることができる。

x = ['.'] * 3

print(x)

x[1] = '*'

print(x)

code

しかし、二次元にすると、ちょっとおかしなことになる。 (1,1)だけ変えたいのに、(0,1), (2,1)も変わってしまう。

def present(l):
    for i in range(len(l)):
        print(l[i])

    print('')

x = [['.'] * 3] * 3

present(x)

x[1][1] = 'B'

present(x)

output

['.', '.', '.']
['.', '.', '.']
['.', '.', '.']

['.', 'B', '.']
['.', 'B', '.']
['.', 'B', '.']

code

どうやら参照してしまっているぽい。

def present(l):
    for i in range(len(l)):
        print(l[i])

    print('')

x = [['.'] * 3] * 3

print(id(x[0]))
print(id(x[1]))
print(id(x[2]))

output

4545478784
4545478784
4545478784

正解

code

for文を使って作成する

def present(l):
    for i in range(len(l)):
        print(l[i])

    print('')

x = [['.'] * 3 for i in range(3)]

present(x)

x[1][1] = 'B'

present(x)

output

['.', '.', '.']
['.', '.', '.']
['.', '.', '.']

['.', '.', '.']
['.', 'B', '.']
['.', '.', '.']

独習Python

独習Python