Python/45가지 파이썬 기초문법 예제

파이썬 (2) - 할당 및 비교(Assigning & Comparison)

monstro 2025. 2. 27. 00:50
728x90
반응형

파이썬에서 동일한지를 비교하는 연산자는 ==과 is가 존재한다

이 두 연산자에는 큰 차이점이 존재하는데,

== 연산자의 경우 을 기준으로 동일한지를 판단하고

is 연산자의 경우 object 즉, 객체의 참조를 기준으로 동일한지를 판단한다

 

- 첫 번째 예제

x = 15
y = 25
print(f"x == y : {x == y}") 
print(f"x is y : {x is y}")

 

 

위의 식을 실행하게 되면 값과 각 변수가 생성된 메모리의 주소가 다르므로 false가 출력된다

그렇다면 다음과 같은 경우는 어떨까?

a = 15
b = 15
print(f"a == b : {a == b}")
print(f"a is b : {a is b}")

 

두 변수 a와 b의 값은 동일하지만 생성된 위치가 다르기에 true와 false가 출력될 것 같지만,

실행 결과는 다음과 같다

 

 

위와 같이 결과가 나온 이유는 파이썬의 내부 동작 원리에서 찾을 수 있다

파이썬은 정수 256까지의 범위에 대해 이미 해당 값이 존재하면 기존의 객체를 바인딩한다

이를 통해 메모리의 낭비를 최대한 줄이는 방식으로 동작한다

 

따라서 a와 b는 모두 동일한 참조값을 갖게 된다

 

- 두 번째 예제

list1 = ['apple', 'banana', 'kiwi']
list2 = list1
print(f"list1 == list2 : {list1 == list2}") 
print(f"list1 is list2 : {list1 is list2}") 
print(f"list1 value : {list1}, id : {hex(id(list1))}")
print(f"list2 value : {list2}, id : {hex(id(list2))}")


list3 = ['apple', 'banana', 'kiwi']
list4 = ['apple', 'banana', 'kiwi']
print(f"list3 == list4 : {list3 == list4}") 
print(f"list3 is list4 : {list3 is list4}") 
print(f"list3 value : {list3}, id : {hex(id(list3))}")
print(f"list4 value : {list4}, id : {hex(id(list4))}")

 

총 4개의 리스트를 대상으로 == 연산자와 is 연산자를 시험한다

첫번째 코드의 경우, list1을 생성하고 list2에 대입한다

두번째 코드의 경우 동일한 데이터를 가진 2개의 리스트 list3과 list4를 각각 생성한다

 

생성한 4개의 리스트에 대해 동일한지 판단하고

추가적으로 리스트의 값과 리스트의 ID 또한 확인한다

 

실행 결과는 다음과 같다

 

list1과 list2는 서로 값은 물론이고 참조까지 동일하다

list2의 경우, list1으로부터 복사되어 생성되었으므로 ID 역시 동일한 것을 확인할 수 있다

 

그러나 list3와 list4의 경우는 다르다

값은 동일하더라도 생성은 각각 다른 메모리에서 생성되어 ID 역시 동일하지 않은 것을 확인할 수 있다

 

- 세 번째 예제

더욱더 확실하게 알아보는 방법은 다음과 같다

n1 = []      
n2 = n1      
n3 = n1 + n2 

print(f"Equal operation Resul is {n1 == n2 == n3}")
print(f"Is operation result is {n1 is n3 is n3}")

 

위와 같은 코드를 구성하였다

n1은 빈 배열이고, n2는 n1으로부터 복사되어 생성하였다

그리고 n3는 n1과 n2를 더하여 생성되었다

 

코드의 실행결과는 다음과 같다

 

값은 같되, 참조값은 다르다는 것을 확인할 수 있다

n1과 n2를 비교해보면 값과 참조 모두 동일하지만,

n3를 n1이나 n2 모두와 비교하면 참조만큼은 동일하지 않음을 확인할 수 있다

 

즉, n3는 n1이나 n1으로부터 복사된 n2와는 다르게 완전히 다른 메모리에 저장되었다

728x90
반응형