2차원 배열 생성 시, List Comprension 사용
-> 각각의 독립적인 원소들을 만들어 id 값의 중복을 없앰
- 두 변수 id의 중복이 발생한다면?
== 두 변수는 같은 데이터를 가리킨다
== 얕은 복사
a = [1, 2, 3]
b = a # 얕은 복사
print(b)
# [1, 2, 3]
b[0] = 10
print(b)
# [10, 2, 3]
print(a)
# [10, 2, 3]
b 값을 변경했지만 a 값도 바뀜
print(id(a))
# 1701393449088
print(id(b))
# 1701393449088
a와 b는 같은 id값을 갖고 있음
얕은 복사가 일어나지 않게 하려면?
1. 깊은 복사 (deepcopy) 사용
import copy
a = [1, 2, 3]
c = copy.deepcopy(a)
print(c)
# [1, 2, 3]
c[0] = 100
print(c)
# [100, 2, 3]
print(a)
# [1, 2, 3]
print(id(c))
# 1701393606848
print(id(a))
# 1701387457792
- 각각 다른 id값에 저장되지만, 파일의 크기가 커짐
2. List Comprehension
2차원 배열 문제에서, 0으로 채워진 배열을 만들어야 할 때 얕은 복사가 일어나지 않도록 배열을 만듦
# SWEA 4836 참고
배열을 아래와 같이 만들었을 때,
arr = [[0]*10]*10
# [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
arr[0][0] = 1
# [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
모든 원소의 0번째 인덱스에 1이 할당됨
이를 해결하기 위해서 List comprehension 사용
arr = [[0 for j in range(10)] for i in range(10)]
# 또는
arr = [[0]*10 for _ in range(10)]
각 원소들이 독립적으로 존재하게 된다
arr = [[0] * 10 for _ in range(10)]
print(arr)
# [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
arr[0][0] = 1
print(arr)
# [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
'IT (프론트엔드)' 카테고리의 다른 글
[TIL] Execution context (실행 컨텍스트) (0) | 2024.02.17 |
---|---|
Javascript vs Typescript : 어느 것을 써야 할지 고민이 된다면? (0) | 2023.10.28 |
스크롤 동작 최적화를 위한 옵션, "Passive event listener" (0) | 2023.09.23 |
[Git] Git push error (0) | 2023.06.21 |
[TIL] Local Storage vs. Session Storage (vs. Cookie) (0) | 2023.06.03 |