Programming

[Python] 실수하기 좋은 파이썬 문법들

stein 2022. 3. 5. 19:21

코딩테스트를 준비하다, 파이썬의 까다로운 문법들을 만나서 정리한다.

 

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

 

Is there a difference between "==" and "is"?

My Google-fu has failed me. In Python, are the following two tests for equality equivalent? n = 5 # Test one. if n == 5: print 'Yay!' # Test two. if n is 5: print 'Yay!' Does this hold ...

stackoverflow.com

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)를 쓰지말자. 위험하다.