2d массив нулей

В Python нет типа массива, но для эмуляции мы можем использовать списки. Я хочу, чтобы 2-мерная структура была заполнена нулями. Мой вопрос: в чем разница, если таковая имеется, в этих двух выражениях:

zeros = [[0 for i in xrange(M)] for j in xrange(M)]

а также

zeros = [[0]*M]*N

Будетzeros быть таким же? какой из них лучше использовать с помощью скорости и читабельности?

Ответы на вопрос(3)

предпочтительный ответ

zeros = [ [0] * N for _ in range(M)]

для массива M x N нулей

с есть такой код:

[lst] * N

гдеlst является ссылкой на список, у вас будет следующий список:

[lst, lst, lst, lst, ..., lst]

Но поскольку список результатов содержит ссылки на тот же объект, если вы измените значение в одной строке, оно будет изменено во всех других строках.

Решение Вопроса

Вы должны использоватьnumpy.zeros, Если это не вариант, вам нужна первая версия. Во второй версии, если вы измените одно значение, оно будет изменено в другом месте списка - например:

>>> a = [[0]*10]*10
>>> a
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> a[0][0] = 1
>>> a
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

Это потому, что (когда вы читаете выражение изнутри), вы создаете список из 10 нулей. Затем вы создаете список из 10 ссылок на этот начальный список из 10 нулей.

Обратите внимание, что:

zeros = [ [0]*M for _ in xrange(N) ]

также будет работать, и это позволит избежать понимания вложенного списка. Еслиnumpy не на столе, это форма, которую я бы использовал.

 mgilson31 окт. 2012 г., 13:37
@yakxxx - обратите внимание, что[ [0]*M for _ in xrange(N) ] также будет работать и избегать вложенных списков (поскольку 0 является неизменным)
 mgilson31 окт. 2012 г., 13:34
@johnthexiii - Возможно, нет. Но, если OP хочет получить двумерный массив нулей, я хотел бы выйти на конечность и сказать, что код OP может, вероятно, извлечь выгоду из numpy и в других местах.
 Valeriy26 нояб. 2017 г., 15:23
Первая версия убить мой день!
 John31 окт. 2012 г., 13:32
Действительно ли необходимо использовать Numpy просто для этой единственной функции? +1 за первую версию.
 yakxxx31 окт. 2012 г., 13:36
Я не буду устанавливать NumPy просто для обнуления списка;) Спасибо за последующее объяснение, это было то, что я искал.

Ваш ответ на вопрос