В чем разница между этими двумя объявлениями массивов в Python? - PullRequest
1 голос
/ 10 декабря 2011

В чем разница между этими двумя объявлениями массивов в Python?

table = [[0]*100]*100
table = numpy.zeros([100,100], int)

Ответы [ 2 ]

5 голосов
/ 10 декабря 2011

Ну, на первый раз опасно неправильно. Смотрите это:

In [8]: table = [[0]*2]*10

In [9]: table
Out[9]: 
[[0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0]]

In [10]: table[0][1] = 5

In [11]: table
Out[11]: 
[[0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5]]

Это происходит потому, что, как вы объявили table, подсписок дублируется снова и снова. См. этот FAQ для получения информации о том, как сделать это правильно.

5 голосов
/ 10 декабря 2011

На самом деле они не имеют ничего общего. Второй - это двумерный массив. Первый ничего полезного - это массив из 100 элементов, каждый из которых является ссылкой на один массив из 100 нулей:

table = [[0]*100]*100
table[1][0]=222
print table[0][0]

Это печатает '222'!

table = numpy.zeros([100,100], int)
table[1][0]=222
print table[0][0]

Это печатает '0'!

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