我在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经验。如果可能的话,我不是在寻找一种解决方法(不是我会介意的),而是解释这种行为?
谢谢!
答案 0 :(得分:0)
这会列出len(b)
个len(a)
零列表的d = [[0] * len(a)] * len(b)
个引用。共创建了两个相互关联的列表。
d = [[0] * len(a) for _ in b]
您想要做的是:
int
{{1}}是不可变的,因此可以安全地复制。