파이썬 코드 질문 드립니다.
조회수 581회
동적프로그래밍 LCS 문제를 푸려고 하는데 Array 출력이 계속 이상하게 되네요.. 코드는 아래와 같은데
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)
결과는 이렇게 나오네요 첫째줄은 for loop 에서 안건드렸는데 왜 저렇게 나올가요?
1 답변
-
lcsarray = [[0]*(len(B)+1)]*(len(A)+1)
을lcsarray = [[0]*(len(B)+1) for _ in range(len(A)+1)]
로 바꾸면 됩니다.
첫번째는list
안에[0] * (len(B)+1)
을 똑같이 복사했기 때문입니다.
즉, 첫번째lcsarray[0] ~ lcsarray[len(A)]
까지 같은 객체입니다. 그래서lcsarray[0]
을 수정하면 나머지lcsarray[1] ~ lcsarray[len(A)]
도 똑같이 바뀝니다.
첫번째와 같은 프로그래밍은 하지 않는게 좋습니다.
더욱이, 객체 id를 확인해보면 같다고 나올겁니다.aa = [[0] * 3] * 4 for a in aa: print(id(a)) # 동일한 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)) # 다른 id
더 자세히 알고 싶다면
aliasing
,shallow copy
,deep copy
에 대해 공부해보세요.-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력