2014-12-31 4 views
-1

Я только начал изучать питон. Я исхожу из фона C++/Java. Понять двухмерные массивы. Я написал следующий фрагментPython два размера массива

x = [[0]*3]*3 
for i in range(0,3): 
    for j in range(0,3): 
     x[i][j] = i+j 

for i in range(0,3): 
    for j in range(0,3): 
     print x[i][j], 
    print "" 

Почему эта программа печати

2 3 4 
2 3 4 
2 3 4 

вместо моего ожидания

0 1 2 
1 2 3 
2 3 4 

Я думал о причине этого и я не могу сделать вывод, что-нибудь. Это что-то связано с контрольными переменными?

ответ

5

Пройдет первого заявление

>>> x = [0] 
>>> id(x) 
139705127800200 
>>> id(x[0]) 
40157552 

Примечания вниз по этому идентификатору 40157552. Теперь, когда мы умножаем его на 3. Вы можете увидеть адреса из других

>>> y = x*3 
>>> for i in y: 
...  print id(i) 
... 
40157552 
40157552 
40157552 
>>> y 
[0, 0, 0] 

Все они имеют один и тот же идентификатор 40157552. Таким образом, это является причиной того, что вы не смогли получить правильный результат.

Вы можете создавать 2d массивы, как уже упоминалось, или вы можете попробовать модуль numpy по

numpy.zeros((3,3)). 

Это создает точный массив, который вы хотите.

Теперь за небольшую демо

x = [[0 for i in range(3)] for j in range(3)] 
for i in range(0,3): 
    for j in range(0,3): 
     x[i][j] = i+j 

for i in range(0,3): 
    for j in range(0,3): 
     print x[i][j], 
    print "" 

Это напечатает

0 1 2 
1 2 3 
2 3 4 

, как и ожидалось.

4

Вам не следует создавать трехмерный массив с несколькими его элементами на 3, потому что на самом деле вы создаете 3 ссылки на один объект. вместо этого использовать следующее:

x = [[0 for i in range(3)] for j in range(3)]