Python中的数组更新异常



我用python编写了以下代码。在checkd内,当我更新d[ii][jj]时,编译器似乎有自己的自由,并将以下所有列条目设置为1。

代码:

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]

正如您所注意到的,这不仅导致"d"行中的一些随机匹配(d,n,1?!),返回的2d数组只是函数中最后一行的副本。

我对Python有一些经验。如果可能的话,我不是在为这种行为寻找变通办法(我不介意),而是在解释?

谢谢!

这会生成一个len(b)引用列表,该列表指向相同的len(a)零列表。总共创建了两个相互连接的列表。

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

你想做的是:

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

int是不可变的,所以它们可以安全地重复。

相关内容

  • 没有找到相关文章

最新更新