I'm trying to solve the dynamic programming LCS problem, but the Array output keeps getting weird. The code is as follows
A = "ABCBDAB"
B = "BDCABA"
lcsarray = [[0]*(len(B)+1)]*(len(A)+1)
def lcs(x,y):
for i in range (1,len(x)+1):
for k in range(1,len(y)+1):
if x[i-1]==y[k-1]:
lcsarray[i][k] = lcsarray[i-1][k-1]+1
else:
lcsarray[i][k] = max(lcsarray[i-1][k],lcsarray[i][k-1])
for i in lcsarray:
print(i)
print()
lcs(A,B)
print()
for i in lcsarray:
print(i)
Replace lcsarray=[0]*(len(B)+1)]*(len(A)+1)
with lcsarray=[0]*(len(B)+1) for _in range(len(A)+1)]
.
The first is that [0] * (len(B)+1)
was copied equally in list
.
That is, the same object from the first lcsarray[0] to lcsarray[len(A)]
.
So if you modify lcsarray[0]
, the rest of lcsarray[1] ~ lcsarray[len(A)]
will change the same.
It's better not to do the same programming as the first one.
Moreover, if you check the object id, it will be the same.
aa = [[0] * 3] * 4
for a in aa:
print(id(a)) # Same id
aa[0][1] = 99
for a in aa:
print(a)
bb = [[0] * 3 for _ in range(4)]
for b in bb:
print(id(b)) # Another id
To learn more, study aliasing
, shallow copy
, and deep copy
.
© 2024 OneMinuteCode. All rights reserved.