코딩테스트를 준비하다, 파이썬의 까다로운 문법들을 만나서 정리한다.
1. False == 0 은 True이다. (True, False는 1, 0과 거의 비슷하게 간주된다.)
True * 3
> 3
False * 3
> 0
위의 내용보다 중요한 것은
if 0:
print('hi')
>
if 1:
print('hi')
> hi
0과 1이 조건식안에 들어갔을 때, False, True처럼 행동한다는 것.
그리고 가장 헷갈리는 것은
if 0 == False:
print('hi')
> hi
if 0 is False:
print('hi')
>
0 == False도 True이다. 이를 비교하려면 is를 써야한다.
2. python은 작은 숫자들에 대해서 어느정도 캐싱을 한다.
https://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is
In your case, the second test only works because Python caches small integer objects, which is an implementation detail. For larger integers, this does not work:
a = 1
b = 1
print(a is b) # True
끔찍하다...
3. list 곱셈은 shallow copy가 일어날 수 있다.
# 아래 2~5번 라인의 visited 초기화는 한 번에 하나씩만 실행된다고 가정한다.
visited = [[False]*3]*3 # 모든 n번째 리스트의 0번째 값이 변경됨
visited = [[False for _ in range(3)]]*3 # 모든 n번째 리스트의 0번째 값이 변경됨
visited = [[False]*3 for _ in range(3)] # 각 값 주소 다름
visited = [[False for _ in range(3)] for _ in range(3)] # 각 값 주소 다름
print(visited)
visited[0][0] = 100000
print(visited)
# 최초 초기화 값
# [[False, False, False],
# [False, False, False],
# [False, False, False]]
# 모든 n번째 리스트의 0번째 값이 변경됨
# [[100000, False, False],
# [100000, False, False],
# [100000, False, False]]
# 각 값 주소 다름
# [[100000, False, False],
# [False, False, False],
# [False, False, False]]
list를 생성해야할 때, 곱셈(*, asterisk)를 쓰지말자. 위험하다.
'Programming' 카테고리의 다른 글
[알고리즘] 탐색(순차, 이진, 이진 트리, 힙) (0) | 2022.05.17 |
---|---|
[알고리즘] 정렬(선택, 삽입, 퀵, 계수) (0) | 2022.05.10 |
python-yeelight response error, Bulb closed the connection. 발생시 (0) | 2022.02.02 |
[VSCode] Windows에서 remote-container vscode 붙이기 (0) | 2022.01.20 |
[VSCode] vscode debugger 사용시 환경변수 세팅 (0) | 2022.01.18 |