자바스크립트에서 == 과 ===의 차이를 공부하다가 파이썬에 is 와 ==가 있는걸 알았는데 자세하게 공부해보았다.
먼저 쉽게 보면 is는 같은 주소에 있는지, ==은 모양새가 같은지 확인하는 것이다.
위의 사진으로 예를 들면 ==은 디스이즈네버댓 반팔이면 True를 반환하고, 같은 티셔츠가 아니라면 False를 반환한다.
하지만 is는 이 티셔츠의 파는곳이 같은지도 검사한다.
무신사의 디스이즈네버댓티셔츠와 쿠팡의 디스이즈네버댓티셔츠는 다른것이다.
이를 코드로 바꿔서 설명을 조금더 하면 다음과 같다.
coupang_t_shirt = 'this is never that'
musinsa_t_shirt = 'this is never that'
print(coupang_t_shirt is musinsa_t_shirt) #False
print(coupang_t_shirt == musinsa_t_shirt) #True
is는 주소값이 같아야 하고, ==은 같은티셔츠이기만 하면 된다는 뜻이다.
그런데 여기서 그러면 변수가 다르면 주소값이 다 다른가? 하고 확인해봤더니 그건 아니었다.
숫자는 같은 값이면 같은 주소를 공유한다.
a = 1
b = 1
print(id(a), id(b))
# 140430296271152 140430296271152
파이썬 변수는 알아서 같은 숫자이면 같은 주소값을 공유한다.
하지만 또 int형은 같지만 float형은 다르다.
a = 1.2
b = 1.2
c = 1
d = 1
print(id(a), id(b), id(a)==id(b))
print(id(c), id(d), id(c)==id(d))
# 140429029883216 140429029882256 False
# 140430296271152 140430296271152 True
그리고 이것저것 해보다가 문자열도 띄어쓰기가 있으면 다른 주소값을 할당하고,
띄어쓰기가 없다면 같은 주소값을 할당한다.
a ='1111'
b ='1111'
print(id(a), id(b), id(a)==id(b))
a ='11 11'
b ='11 11'
print(id(a), id(b), id(a)==id(b))
# 140429029926512 140429029926512 True
# 140429029928432 140429029928560 False
파이썬에서 띄어쓰기가 있는 문자열 변수는 다른 주소값을 가지는 이유는
문자열 리터럴이 불변(immutable)하기 때문이다.
파이썬에서 문자열 리터럴은 한 번 생성되면 변경할 수 없다.
따라서 동일한 문자열 리터럴을 사용하는 두 개의 문자열 변수는 항상 같은 주소를 가지게 된다.
예를 들어 "1111" 문자열 리터럴을 사용하는 두 개의 변수는 항상 같은 주소를 가지게 되지만,
"11 11"은 다른 주소값이 된다.
즉, 띄어쓰기가 있는 문자열 변수는 문자열 리터럴을 사용하지 않기 때문에 다른 주소값을 가지게 된다.
띄어쓰기가 있는 문자열 변수는 새로운 문자열 객체가 생성되어 그 안에 문자열이 복사되기 때문이다.
생각보다 파이썬 구조를 알게 되어서 뜻깊은 시간이었다.
'개발 > 파이썬공부' 카테고리의 다른 글
예외처리 (0) | 2023.06.29 |
---|---|
파이썬으로 이미지 확장자 변경하기 (0) | 2023.04.05 |
프로그래머스 '입문' Lv.0 풀이 완료 (0) | 2023.02.18 |
파이썬 := 연산자와 dict()에 대해서 (0) | 2023.02.15 |
댓글