Python 프로그래밍 언어를 처음 접하는 사람들은 "=="(동일성)과 Python의 키워드 "is"(동등성)의 차이점에 대해 약간 혼란스러울 수 있습니다.
나는 심지어 그들의 코드에 논리적 오류를 도입할 정도로 미묘한 차이를 발견할 숙련된 프로그래머가 이 둘 사이를 헷갈려 하는 것을 보아왔습니다. 이 기사에서는 이 흥미로운 주제에 대해 살펴보겠습니다.
파이썬에서 Equality(동일성)
많은 프로그래밍 언어에는 등호 개념이 있으며, 일부는 이중 등호("==")를 사용하여 이 개념에 적용합니다. 실행 된 이런 동일성을 살펴봅시다.
>>> num = 1
>>> num_two = num
>>> num == num_two
True
여기에서 num이라고 하는 변수를 만들고 여기에 정수를 할당합니다.
1. 다음으로 num_two라는 두 번째 변수를 만들고 이를 num 값에 할당합니다.
마지막으로 우리는 Python에 num과 num_two가 같은지 물어봅니다.
이 경우 Python은 우리에게 이 표현식이 True라고 알려줍니다.
이런 동일성에 대한 또다른 접근 방법은 두 변수가 동일한 것을 포함하는지 Python에 물어보는 것입니다. 위의 예에서는 둘 다 정수 입니다.
1. 그럼 동일한 값을 가진 두 개의 list를 만들 때 어떤 일이 발생하는지 살펴봅시다.
>>> list_one = [1, 2, 3]
>>> list_two = [1, 2, 3]
>>> list_one == list_two
True
우리가 예상한 대로 결과가 나왔습니다.
자 그럼, 파이썬에게 이 값들의 동등성에 대해 물어보면 어떤 일이 일어나는지 봅시다:
>>> num is num_two
True
>>> list_one is list_two
False
무슨 일이 일어났느냐구요? 첫 번째 예는 True를 반환했지만 두 번째 예는 False를 반환 했군요! 우리는 다음 섹션에서 이유를 알아 볼 것입니다.
파이썬에서 Identity(동등성)
우리는 하나의 객체가 다른 객체와 동일한지 Python에 묻는다는 것은 두 객체가 같은 동등성(identity)를 가지고 있는지 묻는 것입니다. 그들은 실제로 같은 객체일까요? num 및 num_two의 경우 답은 그렇다 입니다.
Python은 내장 id() 함수를 통해 쉽게 증명할 수 있는 방법을 제공합니다:
>>> id(num)
10914368
>>> id(num_two)
10914368
이 두 변수가 동일한 ID를 공유하는 이유는 num을 num_two에 할당할 때(즉, num_two = num) 이 ID를 반환해야 한다고 Python에 지시했기 때문입니다.
C 또는 C++에서 온 경우 ID를 num 및 num_two가 모두 메모리에서 동일한 위치를 가리키는 포인터로 생각할 수 있습니다.
두개의 list 객체에 Python의 id() 함수를 사용하면 이 두 객체는 서로 다른 ID를 가지고 있음을 빠르게 알 수 있습니다:
>>> id(list_one)
140401050827592
>>> id(list_two)
140401050827976
따라서 Python에 "list_one is list_two"라고 질문 하면 False를 받습니다. 한 객체가 다른 객체가 아닌지 Python에게 물어볼 수도 있습니다:
>>> list_one = [1, 2, 3]
>>> list_two = [1, 2, 3]
>>> list_one is not list_two
True
equality(동일성)과 identity(동등성)을 혼합하면 어떤 일이 일어나는지 알아보는 시간을 가져봅시다.
둘의 혼합
Python 프로그래머를 시작했을 때 이런 종류의 일이 어리석은 실수가 있을 것이란 걸 (어느 정도) 알고 있었습니다. 그 이유는 다음과 같은 권장 구문을 볼 수 있기 때문입니다:
if obj is None:
# do something
call_function()
그래서 나는 당신이 아래와 같은 코드를 작성 할 수 있지 않을까하고 순수하게 가정합니다:
>>> def func():
return [1, 2, 3]
>>> list_one = [1, 2, 3]
>>> list_two = func()
>>> list_one is list_two
False
물론, 이제 ID가 다른 두 개의 다른 객체가 있으므로 제대로 동작하지 않습니다. 내가 여기서 원래 하고 싶었던 것은 이런 것이었습니다.
>>> list_one == list_two
True
이 문제와 접하는 또 다른 문제는 동일한 객체를 가리키는 두 개의 변수를 만들지만 서로 독립적으로 작업할 수 있다고 생각하는 경우입니다.
>>> list_one = list_two = [1, 2, 3]
>>> list_one == list_two
True
>>> list_one is list_two
True
>>> list_two.append(5)
>>> list_one
[1, 2, 3, 5]
이 예제에서는 둘 다 하나의 객체를 가리키는 두 개의 변수를 만들었습니다. 그런 다음 list_two에 요소를 추가해 보았습니다.
많은 초보자가 깨닫지 못하는 것은 해당 요소를 list_one에도 추가했다는 것입니다.
그 이유는 list_one과 list_two가 정확히 같은 객체를 가리키고 있기 때문입니다.
이것은 우리가 Python is list_one is list_two라고 물었을 때 입증되었으며 True를 반환했습니다.
마치면서
바라건대 이제 파이썬에서 동일성(==)과 동등성(is)의 차이점을 이해하셨기를 바랍니다.
Equality(동일성)는 기본적으로 두 객체의 내용이 같은지 묻는 것이고, list의 경우에sms 같은 순서여야 합니다.
Python의 Identity(동등성)는 참조하는 개체를 나타냅니다.
Python에서 개체의 Identity(동등성)는 객체의 수명(주기) 동안 존재하는 고유한 상수 정수(또는 긴 정수)입니다.
좀 더 알아보기
id() 함수에 대한 파이썬 문서
"is"의 파이썬 문서
StackOverflow: Python의 is 연산자 이해
'프로그래밍' 카테고리의 다른 글
final 키워드가 자바 가비지콜렉션을 향상 시킬까요? (0) | 2022.11.25 |
---|---|
[C#]제공자가 oracle 클라이언트 버전과 호환되지 않습니다 (0) | 2022.11.24 |
Bucket Sort 알고리즘 (0) | 2022.11.21 |
쿠버네티스-Pod 관련 실행 연습 (0) | 2022.11.20 |
Kubernetes? 쿠버네티스? (0) | 2022.11.19 |