Списки разыменования внутри списка в Python

Когда я определяю список в «общем» виде:

>>>a=[[]]*3 >>>a [[],[],[]] 

а затем попытаться добавить только ко второму элементу внешнего списка:

 >>>a[1].append([0,1]) >>>a [[[0,1]], [[0,1]], [[0,1]]] 

он добавляется ко всем элементам внешнего списка, как видно выше, вероятно, из-за того, что элементы являются ссылками на один и тот же список, а не на разные списки (почему это работает именно так?). Как я могу создать список одним и тем же «общим» способом, так что внутренние списки будут разными списками, а не только ссылками. Благодарю.

Вы правы, все ссылки на один список.

 [[] for _ in range(3)] 

является общим способом создания списка независимых пустых списков. Вы можете использовать xrange на Python 2.x, но это не изменит, если длина на самом деле такая же малая, как в вашем примере.

Не знаю, как объяснить причину этого (причина в том, что он реализован таким образом), но вы можете видеть, что это поведение документировано (по крайней мере, мимоходом) здесь :

 Operation Result Notes s * n, n * sn shallow copies of s concatenated (2) 

Слово «мелкий» здесь означает именно то, что: элементы копируются по ссылке. «Примечание 2» на связанной странице также отвечает на ваш вопрос.