На самом деле это точно, что Вы ожидали бы. Давайте анализировать то, что происходит здесь:
Вы пишете
lst = [[1] * 4] * 3
, Это эквивалентно:
lst1 = [1]*4
lst = [lst1]*3
Это означает lst
, список с 3 элементами все указывающие lst1
. Это означает, что два после строк эквивалентны:
lst[0][0] = 5
lst1[0] = 5
Как lst[0]
только lst1
.
Для получения желаемого поведения можно использовать понимание списка:
lst = [ [1]*4 for n in xrange(3) ]
В этом случае, выражение переоценено для каждого n, ведя к различному списку.