2015-04-04 3 views
0

Есть два способа существует, чтобы объявить 2D массива в Python, Первогоразницы в методах объявления двумерный массива

matrix = [[0.0 for x in range(20)] for x in range(41)] 

второй,

matrix = [[0.0] * 20] * 41 

Первое объявление работает штраф, но второе объявление создает ненужные ссылки. Как это возможно?

+1

Что значит «Как это возможно?» _? Вы имеете в виду, как этого избежать? –

+0

Что вы подразумеваете под созданием ненужных ссылок? –

ответ

1

Во втором случае элементы внешнего списка сами являются списками, то есть изменяемыми объектами. В Python изменяемые объекты назначаются (и, таким образом, копируются) по ссылке, поэтому все 41 элемент внешнего списка идентичны и ссылаются на один и тот же внутренний список.

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

+1

Python не имеет примитивных типов; * все * - это объект, включая списки, float, ints, bools и даже функции. Разница заключается в том, что float являются [неизменяемыми объектами] (http://en.wikipedia.org/wiki/Immutable_object) и поэтому не могут быть изменены. Списки, однако, изменяемы, поэтому любые изменения будут отражены во всех 41 пунктах. – iCodez

+0

@iCodez Спасибо за исправление. –

Смежные вопросы