t = [[0] * 4] * 10000
работает, но, вероятно, не делает то, что вы ожидаете. Вместо создания списка из 10000 списков, он создаст список из 10000 ссылок на одиночный список. Посмотрите, что происходит, когда вы пытаетесь начать изменять элементы внутренних списков:
>>> t = [[0] * 4] * 3
>>> t
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> t[0][0] = 1
>>> t
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
Вместо этого вы, вероятно, ожидаете следующее:
>>> t = [[0] * 4 for _ in xrange(3)]
>>> t
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> t[0][0] = 1
>>> t
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Причина в том, что умножение списка просто создает более длинный список с несколькими ссылками на элементы внутри исходного списка. Это почти никогда не является хорошей идеей, если вы не знаете список содержит полностью неизменные объекты (такие как числа и строки); вот почему все еще можно использовать умножение списка в [0] * 4
в моей версии ответа, хотя умножение внешнего списка в [[0] * 4] * 10000
опасно.