Подтвердить что ты не робот

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

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

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

и

zeros = [[0]*M]*N

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

4b9b3361

Ответ 1

Вы должны использовать 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 не находится в таблице, это форма, которую я бы использовал.

Ответ 2

для Python 3 (не более xrange), предпочтительный ответ

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

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

Ответ 3

Во втором случае вы создаете список ссылок на один и тот же список. Если у вас есть код: [lst] * N где lst - ссылка на список, у вас будет следующий список: [lst, lst, lst, lst,..., lst]. Но поскольку список результатов содержит ссылку на один и тот же объект, если вы измените значение в одной строке, оно будет изменено во всех остальных строках.