일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- simclrv2
- Pseudo Label
- 컴퓨터구조
- Entropy Minimization
- CycleGAN
- SSL
- tent paper
- GAN
- Pix2Pix
- UnderstandingDeepLearning
- 딥러닝손실함수
- 최린컴퓨터구조
- cifar100-c
- dcgan
- ConMatch
- conjugate pseudo label paper
- shrinkmatch
- semi supervised learnin 가정
- BYOL
- mme paper
- Meta Pseudo Labels
- mocov3
- remixmatch paper
- CoMatch
- adamatch paper
- CGAN
- shrinkmatch paper
- dann paper
- 백준 알고리즘
- WGAN
Archives
- Today
- Total
Hello Computer Vision
할당과 복사(얕은 복사, 깊은 복사) 본문
가끔씩 코드를 보면은 copy.copy / copy.deepcopy가 나와서 이전부터 궁금했었는데 이번에 한번 알아보려고 한다.
복사와 비슷한 개념인 할당을 한번 해보자.
a = [1,2,3,4]
b = a
print(b)
[1, 2, 3, 4]
리스트 a를 정의해주고 이를 b에 할당한 모습이다.
b[3] = 2
print(a)
[1, 2, 3, 2]
그리고 b의 원소를 바꾸고 a를 출력해보면 똑같이 a의 원소도 바뀐 것을 확인할 수 있다.
a[3] = 4
print(b)
[1, 2, 3, 4]
이는 반대로 a의 원소를 바꾸어도 b의 원소가 바뀐 것을 확인할 수 있는데 할당을 한다면 두 객체가 같은 주소를 쓰기 때문이다.
print(id(a))
print(id(b))
2435534720448
2435534720448
그렇다면 이제 본격적으로 복사를 알아보자.
import copy
a = [1,2,3,4]
b = copy.copy(a)
print(b)
[1, 2, 3, 4]
copy모듈을 활용하여 변수 a를 복사하였다.
a[3] = 1
print(b)
[1, 2, 3, 4]
그리고 a의 원소를 바꾼다면 할당과는 다르게 b의 원소는 바뀌지 않는다.
여기서 리스트가 아닌 리스트안의 리스트를 한번 바꿔본다면?
a = [1,2,3, [4,5]]
b = copy.copy(a)
print(b)
[1, 2, 3, [4, 5]]
a[3].append(6)
print(b)
[1, 2, 3, [4, 5, 6]]
이렇게 append를 이용해 리스트 안의 리스트에 추가를 해주면 복사된 객체인 b도 변경되는 것을 확인할 수 있다.
a[3] = [4]
print(b)
[1, 2, 3, [4, 5, 6]]
그러나 append가 아닌 단순히 원소만 변경을 해주는 경우 변경되지 않는 것을 확인할 수 있다.
그렇다면 원래의 객체에 변경을 가해도 바뀌지 않는 객체를 만들고 싶다면 어떻게 할까? copy.deepcopy를 쓰면 된다.
a = [1,2,3, [4, 5]]
b = copy.deepcopy(a)
print(b)
[1, 2, 3, [4, 5]]
a[3].append(6)
print(b)
[1, 2, 3, [4, 5]]
이렇게 append를 이용해 추가하여도 변경되지 않는 것을 확인할 수 있다.
결론: 복사를 할 경우 copy.copy를 쓴다면 원래의 객체에 의해 변경될 여지가 많으니 copy.deepcopy를 쓰자
'딥러닝 > 파이썬' 카테고리의 다른 글
파이썬 copy, deepcopy 쓰는 이유 및 사용해보기 (0) | 2024.01.17 |
---|---|
[python] logging.getLogger(__name__) 선언 이유 (0) | 2023.12.24 |
[python] 튜플을 사용하는 이유 (0) | 2023.12.18 |
파이썬 getattr 알아보기 (0) | 2023.05.05 |
파이선 함수에서의 ->(화살표) , :(콜론) 의 쓰임 (0) | 2023.02.18 |