공부일지

[코딩테스트]Python의 리스트의 얕은 복사를 통해 알아보는 참조문제 본문

Computer/Coding Tests

[코딩테스트]Python의 리스트의 얕은 복사를 통해 알아보는 참조문제

이르리의 공부일지 2025. 3. 29. 16:11

썸네일을 만들어봤다..ㅎ

 

 

 

백준 문제를 풀다가 변수 matrix(행렬, 2차원 배열)가 값이 이상하게 할당되는 것을 조사식을 통해 확인했다.

matrix1 과 matrix2의 원소를 합치는 함수를 짰는데

matrix 내에 배열의 값이 똑같이 들어가는 것이다. (아래 캡처 및 코드 참고)

(백준문제 참고 링크: https://www.acmicpc.net/problem/2738)

 

 

def add_matix_elements(n, matrix1, matrix2):
    matrix = [[0]*n] * n
    for i in range(n):
        for j in range(n):
            matrix[i][j] = matrix1[i][j] + matrix2[i][j]

    return matrix

VSCode 디버거 조사식

 

이유는 얕은 복사 때문이다. 그리고 자료형!(가변객체, 불변객체)

리스트에서 *는 반복(복사)하겠다는 의미인데, 이렇게 되면 얕은 복사로 인해 자료형의 같은 주솟값을 참조하게 된다.

내가 원한 건 서로 다른 1차원 배열로 이루어진 2차원 배열인데

서로 같은 주소를 가지는 1차원 배열로 이루어진 2차원 배열이 되어버린 것이다.

 


해결

matrix = [[0 for _ in range(m)] for _ in range(n)]

혹은

matrix = [[0]*m for _ in range(n)]

 

+) [0]*m 은 0이 불변객체인 상수여서 가능한 것이다. 단순히 0을 n개 포함하는 리스트를 만드는 간단한 방법일 뿐!