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', '.'] ['.', '.', '.']