20110524

Matrizes no Python como lista de listas

Precisávamos de uma implementação de matrizes no Python e lista de listas foi a idéia imediata.
Sabíamos que as seguintes interações funcionavam para copiar uma lista.

>>> a = [1,2,3]
>>> b = a[:]
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> b[1] = 5
>>> b
[1, 5, 3]
>>> a
[1, 2, 3]

Com base nisso, tentamos o mesmo com matrizes.

>>> a = [[1,2,3], [4,5,6]]
>>> b = a[:]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> b[1][1] = 7
>>> b
[[1, 2, 3], [4, 7, 6]]
>>> a
[[1, 2, 3], [4, 7, 6]]

No entanto, vê-se que b[1] e a[1] são o mesmo objeto. A solução, ainda utilizando lista de listas, é copiar as listas internas (linhas da matriz) manualmente, como no exemplo seguinte:

>>> a = [[1,2,3], [4,5,6]]
>>> b = []
>>> b.append(a[0][:])
>>> b.append(a[1][:])
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> b[1][1] = 7
>>> b
[[1, 2, 3], [4, 7, 6]]
>>> a
[[1, 2, 3], [4, 5, 6]]