Я читаю Как думать как компьютерный ученый, который является вводным текстом для "программирования на Python".
Я хочу уточнить поведение оператора multiply (*
) при применении к спискам.
Рассмотрим функцию make_matrix
def make_matrix(rows, columns):
"""
>>> make_matrix(4, 2)
[[0, 0], [0, 0], [0, 0], [0, 0]]
>>> m = make_matrix(4, 2)
>>> m[1][1] = 7
>>> m
[[0, 0], [0, 7], [0, 0], [0, 0]]
"""
return [[0] * columns] * rows
Фактический вывод
[[0, 7], [0, 7], [0, 7], [0, 7]]
Правильная версия make_matrix:
def make_matrix(rows, columns):
"""
>>> make_matrix(3, 5)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> make_matrix(4, 2)
[[0, 0], [0, 0], [0, 0], [0, 0]]
>>> m = make_matrix(4, 2)
>>> m[1][1] = 7
>>> m
[[0, 0], [0, 7], [0, 0], [0, 0]]
"""
matrix = []
for row in range(rows):
matrix += [[0] * columns]
return matrix
Причина, по которой первая версия make_matrix терпит неудачу (как поясняется в книге в 9.8), заключается в том, что
... каждая строка является псевдонимом других строк...
Интересно, почему
[[0] * columns] * rows
вызывает... каждая строка является псевдонимом других строк...
но не
[[0] * columns]
то есть. почему каждый [0]
в строке не является псевдонимом другого элемента строки.