2013-02-22 4 views
0

Я написал следующий код в python. В checkd, когда я обновляю д [б] [JJ], кажется, как будто компилятор берет свои вольности и делает все следующие данные столбца 1.Array update anomaly в Python

Код:

def checkd(d, level, a, b): 
i = len(b) 
j = len(a) 
print ['0'] + list(a) 
for ii in range(i): 
    for jj in range(j): 
     if a[jj] == b[ii]: 
      #print a[jj] +" "+ b[ii] + " Matched." 
      d[ii][jj] = 1 
     print b[ii] + "\t" + a[jj] + "\t" + str(d[ii][jj]) 
    print [b[ii]] + [str(m) for m in d[ii]] 
return d 


a = raw_input("First word:") 
b = raw_input("Second word:") 
w = input("Size of words to check:") 

d = [[0]*len(a)]*len(b) 

d = checkd(d, w, a, b) 
print d 
for x in d : print x 

Выход:

First word:ascend 
Second word:nd 
Size of words to check:2 
['0', 'a', 's', 'c', 'e', 'n', 'd'] 
n a 0 
n s 0 
n c 0 
n e 0 
n n 1 
n d 0 
['n', '0', '0', '0', '0', '1', '0'] 
d a 0 
d s 0 
d c 0 
d e 0 
d n 1 
d d 1 
['d', '0', '0', '0', '0', '1', '1'] 
[[0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1]] 
[0, 0, 0, 0, 1, 1] 
[0, 0, 0, 0, 1, 1] 

Как можно заметить, не только это приводит к некоторой случайной игре (г, п, 1 ?!) в строке «г», возвращаемый 2d массив просто копия последней строки одного в функции.

У меня есть опыт работы с Python. Я не ищу обходное решение (не то, чтобы я думал), насколько возможно объяснение этого поведения?

Спасибо!

ответ

0

Это список из len(b) ссылок на этот список len(a) нули. Создано два взаимосвязанных списка.

d = [[0] * len(a)] * len(b) 

То, что вы хотите сделать, это:

d = [[0] * len(a) for _ in b] 

int s неизменны, поэтому они безопасны продублировать подобное.

+0

спасибо. Я нашел ответ через несколько минут после: http://stackoverflow.com/questions/240178/unexpected-feature-in-a-python-list-of-lists –