일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- programmers
- Vue.js
- gpdb
- 코테
- 모의SW역량테스트
- aws
- BFS
- 시뮬레이션
- Trie
- Python
- Linked list
- Data Structure
- 구현
- hash table
- 알고리즘
- SWEA
- JavaScript
- spring boot
- Algorithm
- Bruth Force
- DFS
- Back tracking
- 코딩테스트
- 알고리듬
- boj
- django
- GitHub
- SQL
- Priority Queue
- CSV
- Today
- Total
hotamul의 개발 이야기
진짜 이상한 Python의 del 본문
>>> number = 123
>>> number
123
>>> del number
>>> number
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'number' is not defined
Python에서 del
keyword를 사용하면 위와 같이 number
은 더 이상 사용할 수 없게 된다. number
에 접근하려고 하면 더 이상 해당 변수가 없기 때문에 NameError
가 발생한다.
하지만 del
은 객체를 제거하는 것이 아니라 변수와 같은 reference를 제거하는 것이 주요 목표이다.
다음 이상한 예시를 확인해 보자.
>>> class MyClass:
... def __del__(self):
... print("MyClass deleted!")
...
>>> a = MyClass()
>>> b = a
>>> del a # 여기서 "MyClass deleted!"가 출력될거 같아!
>>> del b
MyClass deleted!
여기서 확인할 수 있는 것은 del
은 직접 a.del()
을 호출하지 않는다는 것이다. del a
를 만나게 되면 Python은 현재 scope에서 이름 a
를 삭제하고 a
가 참조하는 객체의 reference count를 1만큼 감소시킨다. 즉 del()
은 해당 객체의 참조 횟수가 0이 되었을 때만 호출된다.
다시 말해 del
은 reference count를 감소시키는 역할을 하고 객체 제거는 가비지 컬렉션 시스템을 통해 메모리 해제가 수행된다. (del
을 사용한다는 것은 객체의 마지막 reference를 제거할 때만 코드의 메모리 소비를 줄일 수 있게 해 주며, del
은 해당 객체가 가비지 컬렉션 될 준비를 하게 해 준다고 할 수 있다.)
(하지만 Python의 가비지 컬렉션 시스템은 객체의 마지막 reference를 제거하고 해당 객체의 reference count를 0으로 줄인 후 즉시 메모리를 해제하지는 않는다. 대신 주기적으로 메모리를 검사하여 참조되지 않은 객체를 해제하는 방식으로 동작한다. Python의 자세한 가비지 컬렉션 전략들이나 성능 최적화 방법들이 궁금하다면 고성능 ML 백엔드를 위한 10가지 Python 성능 최적화 팁 | Hyperconnect Tech Blog를 참고하면 많은 도움이 될 것 같다. 나는 많은 도움이 되었다...)
'Dev. > Python' 카테고리의 다른 글
[Python] OpenCV Face Detection (0) | 2023.01.01 |
---|---|
[Python] OpenCV로 image size 조절하기 (0) | 2023.01.01 |
[Python] image 파일 numpy.ndarray로 불러오기 (0) | 2023.01.01 |
[Data][Python] Pandas + Numpy example (0) | 2022.01.10 |
[Data][Python] Pandas example (0) | 2022.01.10 |