코딩 테스트 준비를 하다보면 2차원 이상의 배열을 생성하는 경우가 많다.
어떤 경우에는 배열의 모든 요소를 초기에 0으로 초기화하고 문제를 풀도록 되어 있다.
만약에 [[0,0,0],[0,0,0]] 형태의 2차원 배열을 생성한다고 할 때
arr1 = [[0 for _ in range(3)] for _ in range(2)]
arr2 = [[0]*3]*2
위 두 코드로 만들 수 있지만 두 배열에는 엄청 큰 차이가 있다.
arr1의 경우 각 내부 리스트는 독립적인 객체로 존재하며, 각각의 요소에 대한 변경이 다른 리스트에 영향을 미치지 않는다.
arr1[0][0] = 1
print(arr1)
>> [[1, 0, 0], [0, 0, 0]]
그러나, arr2의 경우 하나의 리스트 객체를 두 번 반복하여 2차원 리스트를 생성한다.
내부 리스트는 동일한 객체를 참조하게 되므로, 한 내부 리스트의 요소를 변경하면 다른 내부 리스트도 영향을 받게 된다. 즉, 하나의 요소를 변경하면 열의 동일한 위치에 있는 요소도 함께 변경된다
arr2[0][0] = 1
print(arr2)
>> [[1, 0, 0], [1, 0, 0]]
실제로 내가 문제를 풀 때 이 차이를 몰라서 꽤 오래 헤맸었다.
GPT의 도움덕에 차이를 알게 되었다..😅
모든 배움에 있어서 기초가 가장 중요하다는 것을 이렇게 다시 한번 느꼈다...
추가!!!! - 책을 읽다가 이 부분이 해싱이라는 개념이라는 것을 알게 되었다.
해싱 가능 자료형 : 정수형, 실수형, 문자열, 튜플 => 대체로 저수준 자료형 각 자료형의 인스턴스는 수정 불가능
해싱 불가능 자료형 : 리스트, 딕셔너리, 그 외의 여러 라이브러리 => 보통 크고 복잡하면서 내부의 값을 변경할 수 있는 객체
A = [{},{}]
B = [x for x in A]
A[0]['name'] = 'sol'
print(B[0])
# {'name': 'sol'}
A 와 B가 같은 객체라서가 아니라, A[0] 과 B[0]이 같은 객체이기 때문
A.append('here')
print(A)
print(B)
# [{'name': 'sol'}, {}, 'here']
# [{'name': 'sol'}, {}]
리스트 A에 새로운 성분을 추가해도 리스트 B에는 영향을 주지 않음 (A와B는 같은 객체가 아니기 때문)
* 딕셔너리의 키는 해싱이 가능한 자료형만 사용 가능
'🏷️CS > Python' 카테고리의 다른 글
[for 와 else 를 같이 사용] (0) | 2023.07.31 |
---|---|
[정규표현식] re 모듈 (0) | 2023.07.14 |
[assert 가정 설정문] (1) | 2023.07.10 |
[anaconda 가상환경] (0) | 2023.01.07 |
[NLP] 정규표현식 (Regular Expression) (0) | 2023.01.07 |