WeniVooks

검색

견고한 파이썬

식별연산

식별 연산자는 두 변수가 동일한 객체를 참조하고 있는지 확인하는 데 사용됩니다. 파이썬에서는 isis not을 사용하여 이를 확인할 수 있습니다.

연산자 설명
is 두 변수가 같은 곳에 저장된 정보를 바라보고 있다면 ‘맞다’(True)를 알려줍니다. 다른 곳을 바라보고 있다면 '아니다'(False)를 알려줍니다.
is not 두 변수가 같은 곳에 저장된 정보를 바라보고 있다면 '아니다(False)'를 알려줍니다. 다른 곳을 바라보고 있다면 '맞다(True)'를 알려줍니다.

식별 연산자는 해당 값이 들어있는 값이 들어있는 주소를 비교하는 연산자입니다. 변수를 선언해서 값을 저장할 때 그 값을 저장하는 공간이 필요한데 그 공간의 위치를 주소라고 합니다. 집주소와 비슷한 개념이라고 보시면 됩니다. 서울시 OO구 OO동 같은 주소 체계를 컴퓨터에서도 가지고 있는 것입니다. 중복이 되지 않는 ‘주민등록번호’나 ‘학번’으로 이해하셔도 좋습니다.

coffee 라는 회사에서 일하고 있는 Brand 라는 사람이 있다고 가정합시다. orange 라는 회사에서 일하고 있는 Brand 라는 사람이 있는 이 둘이 동일 인물인지 확인해봅시다.

coffee_employee = "Brand" orange_employee = "Brand" print(coffee_employee is orange_employee) print(coffee_employee == orange_employee)

is를 통해 동일인물이라는 것을 알 수 있습니다. 즉 이 두 회사에 다니고 있는 Brand 라는 이름을 가진 사람은 서울시 OO구 OO동 XX번지에서 살고 있는 동일인물이라고 생각하면 됩니다. 실제 어떤 주소 값을 가지고 있는지는 아래와 같이 id를 통해 확인할 수 있습니다.

id(coffee_employee)

is 연산자가 id를 기준으로 주소가 같은지 찾는 것이라면 == 비교 연산자는 이 같은지 찾는 것입니다. 위의 예시로 보자면 같은 Brand 라는 이름을 가졌는지를 보는 것입니다.

다음 예시를 보면서 확인해 보겠습니다.

a = [1, 2, 3] b = [1, 2, 3] c = a print('a == b', a == b) print('a == c', a == c) print('a is b', a is b) print('a is c', a is c)

위에서는 Brand 라는 문자열을 예시로 들었습니다. 파이썬의 경우 동일한 문자열이 있다면 해당 문자열을 가진 주소를 그대로 참조하게 되어있습니다. 그렇기 때문에 동일한 문자열을 생성하는 경우에는 동일한 주소를 보고 있게 됩니다.

문자열이 항상 동일한 메모리 값을 가지는 것은 아닙니다. 일반적으로 작은 문자열이나 자주 사용되는 문자열은 인터닝(interning)이라는 최적화 방식을 사용하여 같은 메모리 값을 가지지만 문자열의 길이가 길어지거나 자주 사용되는 문자열이 나오지 않을 경우 다른 주소 값을 가리킬 수도 있습니다.

배열과 같은 객체는 문자열과 달리 새로 생성할 때 새로운 주소에 담습니다. 따라서 값은 동일하더라도 다른 주소를 가지게 됩니다. 따라서 위의 예시와 같이 a, b, c의 값을 비교하는 것은 True로 나오지만 주소를 비교했을 때는 다르게 나오는 것을 볼 수 있습니다.

id를 사용하여 실제로 그러한지 확인해봅시다.

x = [1, 2, 3] y = x z = [1, 2, 3] print(x, y, z)

xy 는 같은 리스트를 참조하고 있지만, z 는 새로운 리스트를 참조합니다. 이제 각 변수의 id 값을 확인해보겠습니다:

print(id(x)) # 예: 139760050602048 print(id(y)) # 예: 139760050602048 print(id(z)) # 예: 139760050602888

xyid 값은 같지만, zid 값은 다릅니다.

print(x is y) # True입니다. 왜냐하면 둘 다 동일한 객체를 참조하고 있기 때문입니다. print(x is z) # False입니다. 왜냐하면 둘은 서로 다른 객체를 참조하고 있기 때문입니다.

이처럼 id 함수와 식별 연산자를 사용하면 변수가 어떤 객체를 참조하고 있는지 쉽게 확인할 수 있습니다.

{"packages":["numpy","pandas","matplotlib","lxml"]}
5.4 할당연산5.6 멤버연산