연산자
연산자는 프로그래밍에서 변수나 값에 대해 특정 작업을 수행하는 기호입니다.
연산자의 종류에는 산술 연산자, 관계 연산자, 논리 연산자, 비트 연산자, 대입 연산자, 멤버쉽 연산자, 식별 연산자가 있습니다.
각 프로그래밍 언어에서 지원하는 연산자의 종류와 문법은 조금씩 다를 수 있습니다. 필요한 경우 특정 언어에 맞는 연산자를 확인하는 것이 좋습니다.
이번 포스팅에서는 식별 연산자에 대해 알아봅시다.
식별 연산자 (Identity Operator)
식별 연산자(identity operator)는 두 객체가 동일한 객체인지 여부를 확인하는 데 사용되는 연산자입니다. Python에서 사용되는 식별 연산자는 is와 is not입니다. 이 연산자들은 두 객체가 메모리에서 동일한 위치를 참조하는지를 확인합니다.
1. is 연산자
기능: 두 객체가 동일한 객체인지 확인합니다. 즉, 두 객체가 같은 메모리 주소를 참조하는지를 검사합니다.
예시:
a = [1, 2, 3]
b = a # b는 a를 참조
c = a[:] # c는 a의 복사본
print(a is b) # True, a와 b는 같은 객체를 참조
print(a is c) # False, a와 c는 다른 객체
2. is not 연산자
기능: 두 객체가 서로 다른 객체인지 확인합니다. 즉, 두 객체가 다른 메모리 주소를 참조하는지를 검사합니다.
예시:
print(a is not c) # True, a와 c는 서로 다른 객체
3. 식별 연산자와 동등 연산자 비교
동등 연산자 (==): 두 객체의 값이 같은지를 비교합니다.
식별 연산자 (is): 두 객체가 동일한 객체(메모리 주소)를 참조하는지를 비교합니다.
예시:
x = [1, 2, 3]
y = x # y는 x 참조, 같은 메모리주소 사용
z = x[:] # x의 값을 복사, 다른 메모리주소 사용
print(x == y) # True, 값이 같음
print(x is y) # True, 같은 객체
print(x == z) # True, 값이 같음
print(x is z) # False, 다른 객체
4. 불변 객체와 가변 객체
Python에서 불변(immutable) 객체(예: 정수, 문자열, 튜플)는 메모리 최적화를 위해 동일한 값일 경우 동일한 메모리 주소를 참조할 수 있습니다.
반면, 가변(mutable) 객체(예: 리스트, 딕셔너리)는 새로운 객체로 생성되기 때문에 값이 같더라도 서로 다른 메모리 주소를 가질 수 있습니다.
정수는 불변 객체에 속합니다.
예를 들어
a=5
a=a+5 #a는 10
a=5일때 5의 값을 가진 Int 객체가 새로 생성됩니다.
a=a+5일때 정수는 불변 객체이므로 10의 값을 가진 Int 객체가 새로 생성됩니다.
주의: a의 값이 업데이트 될때 새로운 주소에 새로운 값으로 새로운 객체가 생성되는 것이지 기존의 객체에 값을 업데이트하는 것이 아닙니다.
리스트 또한 불변 객체에 속합니다.
a='hello'
a[1]='o' # 오류, 문자열은 불변객체라 수정할 수 없습니다.
a=a+" world" #a는 "hello world"
a[1]='o'에서 문자열은 불변객체라 수정이 불가능하고 따라서 에러가 납니다
a=a+" world" 에서 a는 "hello world" 값을 갖는 새로운 객체를 생성합니다.
주의: Int경우와 마찬가지로 a의 값이 업데이트 될때 새로운 주소에 새로운 값으로 새로운 객체가 생성되는 것이지 기존의 객체에 값을 업데이트하는 것이 아닙니다.
정수 객체의 경우는 -5 부터 256까지의 정수는 정수 캐싱으로 인해 값이 같으면 동일한 메모리 주소를 갖습니다.
a = 256
b = 256
print(a is b) # True (Python의 정수 캐싱으로 인해)
a = 257
b = 257
print(a is b) # False (각각 다른 객체)
문자열 같은 경우에도 길이가 짧은 문자열은 문자열 캐싱으로 인해 값이 같으면 동일한 메모리 주소를 갖습니다.
# 동일한 문자열 리터럴
s1 = "hello"
s2 = "hello"
print(s1 is s2) # True, 같은 객체 (캐시됨)
s3 = "hello world!" * 1000 # 긴 문자열
s4 = "hello world!" * 1000 # 긴 문자열
print(s3 is s4) # False, 서로 다른 객체 (길이가 길어 캐시되지 않음)
식별 연산자는 두 객체의 동일성을 확인하는 데 유용하며, 객체의 참조를 이해하는 데 중요한 도구입니다. 메모리 관리와 성능 최적화 측면에서도 중요하니, 객체의 특성을 잘 이해하고 활용하는 것이 좋습니다.
'python' 카테고리의 다른 글
[파이썬 / Python] 클래스(Class)와 객체(Object) (0) | 2025.01.23 |
---|---|
[파이썬 / python] 객체 지향 프로그래밍(Object Oriented Programming) (0) | 2024.09.29 |
[파이썬 / python] 연산자 - 멤버쉽 연산자 (in, not in) (0) | 2024.09.20 |
[파이썬 / python] 연산자 - 대입 연산자 (=, +=,-=,*=,/=, %=, //=, ...) (0) | 2024.09.19 |
[파이썬 / python] 연산자 - 비트 연산자 (&, |, ^, ~, <<, >>,) (0) | 2024.09.18 |