mauzerne   3년 전

제가 의도한 코드는 matrix 리스트에 입력을 받고, bfs로 matrix를 탐색하다가 

벽(-1)을 만나면 wallbfs 함수를 실행시키고 함수 로컬변수 submatrix에 matrix를 복제해서 submatrix를 bfs로 탐색합니다. << 28행

근데 submatrix에 입력된 값이 matrix에도 입력이 됩니다.

if submatrix is matrix: 로 확인하면 둘이 다른 리스트임이 확인되는데 

이런 결과를 이해할수가 없어서 질문 올려봅니다

aksndk123   3년 전

파이썬의 주소참조 관련된 개념인데 자세한건 구글링해서 공부하시는걸 추천하고 대충이해만 하시길

matrix자체도 2차원 리스트, 즉 원소가 matrix[0], matrix[1]... 인 리스트를 가집니다.

submatrix = list(matrix) 형식으로 하면 submatrix 와 matrix는 달라도 참조하는 리스트주소값은 그대로입니다. 

즉, submatrix[0] = matrix[0], submatrix[1] = matrix[1].... 처럼 연산되어서 같은 객체를 참조합니다. 사실상, submatrix = matrix 랑 결과는 비슷함

A = [1,2,3]

B = list(A) 랑 다른이유는 원소가 리스트가 아닌 단일객체임.

예를들어서,

n, m =3, 3

L = [[0]*m]*n  # [[0,0,0],[0,0,0],[0,0,0]]

L[1][1] = 1 #[[0,1,0],[0,1,0],[0,1,0]]

처럼 되는데, 내부적으로 포함된 3개의 리스트가 모두 동일한 객체에에 대한 3개의 레퍼런스로 인식되기 떄문입니다. 

[0]*m은 0에 대해서 복사를 하는거라 상관이 없습니다. 근데 [0.0.0]에 대해서 복사를 하는경우 문제가 생김. 리스트이기 때문에

따라서 위의경우는, L = [[0]*m for _ in range(N)] 처럼 초기화를 해줘야 원하는 방식으로 사용가능합니다.

문제로 돌아와서, 이런경우 복사를 하고싶으시면 from copy import deepcopy 를 통해submatrix = deepcopy(matrix) 처럼 사용하시거나, 

따로 함수를 만들어서 2차원 배열인 submatrix을 선언하고 matrix의 원소를 하나하나 탐색하면서 넣어줘야합니다 (submatrix[i][j] = matrix[i][j])

 

mauzerne   3년 전

답변 감사합니다~ 덕분에 궁금하던 부분이 해결됐어요

구글링 해보니 얕은복사, 깊은복사 개념에 대해서도 알 수 있었어요 ㅎ

공부를 더 열심히 해야겠네요 감사합니다~

댓글을 작성하려면 로그인해야 합니다.