오랜만이에요

Python is 연산자

Featured image

정말 오랜만이에요

한동안 포스팅이 없었네요.

이래저래 많은 일들이 있었는데, 지금 와서 생각해보면 있던 일들에 비해 포스팅을 안한 기간이 생각보다 더 길어졌습니다.

단순히 생각하면 나태함의 증거로 딱인 것 같지만..

이렇게 돌아왔으니 그래도 쌤쌤인걸로 합시다.

앞으로의 포스팅

포스팅은 지금까지 해왔던 것 처럼, 일상도 코드도 아이디어도 그게 무엇이든 생각나는대로 편하게 적을 예정입니다.

그게 이 메모장을 만든 이유니까요.

아, 근데 정기적인 포스팅이 생기긴 할 것 같습니다.

개인 프로젝트를 시작했어요.

그동안은 제 코드를 누군가에게 보여주는 것이 부끄럽기도 하고, 누군가가 제 코드를 보고 비웃지는 않을까 하는 마음에 코드를 꽁꽁 싸매고 있었는데, 이대로 가다가는 평생 공개하지 못할 것 같아서 스스로 어느정도 타협점을 찾았습니다.

기존에 작성한 코드들은 아무래도 여전히 부끄러워서, 그것들은 그대로 싸두기로 했습니다.

대신, 예전부터 생각해왔고, 조금씩 만들고 있던 프로젝트를 다시 처음부터 새로이 시작합니다.

여전히 부끄럽지만, 심심하면 구경오세요.

https://github.com/PunRabbit/Juniverse

아, 이 메모장에는 위에서 얘기했던 대로 개인 프로젝트 진행과 관련하여 다양한 글들이 정기적으로 작성될 예정입니다.

많은 관심.. 까진 아니더라도 그냥 소소한 관심 부탁드려요.

이왕 온 김에 적어보는 기묘한 코드 이야기

"a" in ["a", "b"] is True

위 파이썬 코드의 결과는 무엇일 것 같으신가요?

저는 당연하게도(?) True 일 것이라고 생각했습니다.

하지만 놀랍게도 False 가 반환됩니다.

("a" in ["a", "b"]) is True

이렇게 적으면 어떨까요?

True 가 반환됩니다.

a = "a" in ["a", "b"]
b = True

a is b

또 다르게 이렇게 적으면,

True 가 반환됩니다.

단순히 생각했을 때, 뭔가 이상한 지점이 생겨서 얼른 검색을 진행해보았습니다.

python에서의 is 연산자는 동일한 메모리 주소를 가지고 있는지 판단한다.

python은 일부 정수 (-5 ~ 256) 와 Boolean Type에 대해서 동일한 메모리 주소를 바인딩한다.

음.. 도움이 되는 정보는 맞지만, 위의 의문을 해결하기에는 부족합니다. 아니, 오히려 혼란스럽습니다.

True 라는 결과값에 대해서는 동일한 메모리 주소를 바인딩했을텐데, 어째서 첫번째 코드의 결과가 False일까요?

a = True
b = "a" in ["a", "b"]

print(id(True), id(a), id(b))

# 4342342512 4342342512 4342342512

해답을 찾아보고자 한번 몇개의 print를 진행해보았습니다.

내심 다른 값이 나오길 바랬는데, 우려하던대로 전부 동일한 값을 반환했습니다.

음.. 여기서 제가 생각해본 가설은 다음과 같습니다.

python은 일부 값들에 대해 동일한 메모리 주소를 바인딩하나, 해당 바인딩이 일어나는 시점은 할당이 되는 시점이다.

따라서 첫 번째 연산이 False가 나온 이유는, 추측컨데, is 연산자가 연산을 진행하는 과정에서 앞선 “a” in [“a”, “b”] 의 결과를 바인딩하지 않고 그대로 True 의 메모리 주소와 비교했기 때문이다.

python의 연산 과정을 그대로 트래킹할 수 있다면 좋을텐데, 직장 동료들에게 물어본 결과 내가 원하는 만큼의 세세한 트래킹 방법은 흔치 않은 듯 하다.

답답… 하지만 일단은 회사일도 있기에, 추론한 결과와 생각한 원인을 메모하고 반짝 미뤄둬야겠다.

혹 정답을 아는 분이 있다면 꼭 연락주세요.