Estoy leyendo How to think like a computer scientist que es un texto introductorio para "Programación de Python".Operador de multiplicación aplicado a la lista (estructura de datos)
Quiero aclarar el comportamiento del operador de multiplicación (*
) cuando se aplica a las listas.
Considérese la función 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
La salida real es
[[0, 7], [0, 7], [0, 7], [0, 7]]
La versión correcta de make_matrix es:
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
La razón por la cual primera versión de make_matrix falla (como se explica en el libro en 9.8) es que
... cada fila es un alias de las otras filas ...
Me pregunto por qué
[[0] * columns] * rows
provoca ... cada fila es un alias de las otras filas ...
pero no
[[0] * columns]
es decir, por qué cada [0]
en una fila no es un alias de otro elemento de fila.
suena perfecto, muchas gracias !! – fizzbuzz
+1 - muy buena explicación –