2014-10-28 2 views
0

Предположим, у меня есть этот код:Умножить массивы, чтобы сделать матрицу дает неожиданный результат

dim = 3 
eye = [[0] * dim] * dim 

и это список список, я проверил

[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

Теперь, если я делаю это, я получаю :

eye[1][2] = 1 
eye 
[[0, 0, 1], [0, 0, 1], [0, 0, 1]] 

Однако, если я вручную положить в этом выражении, приведенный выше код работает, как ожидалось:

eye2=[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
eye2[1][2] = 1 
eye2 
[[0, 0, 0], [0, 0, 1], [0, 0, 0]] 

В чем разница между этими двумя?

Update: Спасибо за все объяснения, предположим, что у меня есть этот код:

a = [0] 
type(a) 
b = a * 3 # or b = [[0] *3] 

Так, б удерживает 3 ссылки на. И я ожидаю, что изменение b [0] или b [1] или b [2] изменит все 3 элемента.
Но этот код показывает нормальное поведение, почему?

b[1] = 3 
b 
[0, 3, 0] 
+0

Кто-то научил меня, что я могу сделать такое скалярное умножение на списки. Если это так странно, то каково применение этого метода? – user1502776

ответ

1

Любой элемент массива является в качестве метки адреса памяти и когда вы множественным его с переменная на самом деле вы создаете указатель на 3 дворец в вашем массиве! Вы можете понять это с список понимания, как показано ниже:

Matrix = [[0 for x in xrange(3)] for x in xrange(3)] 
0
dim = 3 
eye = [[0] * dim] * dim 

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

0
dim = 3 
eye = [[0] * dim] * dim 
print id(eye[0]) 
print id(eye[1]) 
print id(eye[2]) 

Ouput: -

139834251065392 
139834251065392 
139834251065392 

Так что, когда вы делаете eye = [[0] * dim] * dim это на самом деле refrencing refrencing три list на тот же объект, который eye.

в то время как в другом случае

eye2=[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
print id(eye2[1]) 
print id(eye2[2]) 
print id(eye2[0]) 

Ouput: -

139863345170480 
139863260058256 
139863260067240 

Здесь каждый refrence идентификатор diffrent.

+0

Очень убедительно, спасибо – user1502776

+0

@ user1502776 Пройдите через https://docs.python.org/2/reference/datamodel.html#objects-values-and-types. это проиллюстрирует это. –