[python] id() 정리
python - id()
파이썬의 Built-in Function으로 객체의 식별값을 반환하는 함수, 반환 값 타입은 intid(object)
인자로 object를 넣으면 id 함수는 객체의 unique한 int형 id값을 반환합니다.
id란?
파이썬은 Call by Assignment로 모든 것을 객체로 식별합니다. (문자열, 정수, 클래스 등 모두 객체)id는 객체가 생성될 때 자동으로 할당되며 unique한 값을 보장합니다.
만약, 두 객체의 lifetime이 겹치지 않으면 같은 id 값이 할당될 수 있습니다.
id는 C언어에선 메모리 주소 표현하고 파이썬은 unique id로 표현합니다. (포인터 개념으로 이해하면 됩니다)
id 할당은 프로그램을 실행할 때 마다 매번 다른 값이 부여됩니다.
단, 일반적으로 많이 사용되는 객체는 파이썬에서 내부적으로 메모리가 할당되어 있어 프로그램을 실행할 때 마다 같은 id가 부여됩니다. (Ex, int -5 to 256은 매번 같은 메모리 주소로 할당됨)
단, 일반적으로 많이 사용되는 객체는 파이썬에서 내부적으로 메모리가 할당되어 있어 프로그램을 실행할 때 마다 같은 id가 부여됩니다. (Ex, int -5 to 256은 매번 같은 메모리 주소로 할당됨)
Examples
Mutable과 Immutable 개념이 헷갈리는 분은 Mutable과 Immutable 차이점 글을 참고해주세요.
1. Mutable - list
x = [1, 2, 3]
y = [1, 2, 3]
print(f"x id: {id(x)}, y id: {id(y)}")
# x id: 140572825821664, y id: 140572825824224
x와 y객체를 생성하면 자동으로 id가 할당되며, x와 y의 객체 id를 출력하기 위해 id() 함수를 이용합니다.
두 객체 id가 각각 140572825821664, 140572825824224로 할당된 걸 확인할 수 있습니다.
두 객체 id가 다른 이유를 모르시는 분은 Mutable과 Immutable 차이점 글을 꼭 참고해주세요.
2. Mutable - set
x = {1, 2, 3}
y = {1, 2, 3}
print(f"x id: {id(x)}, y id: {id(y)}")
# x id: 140307489102736, y id: 140307489101536
x와 y객체를 생성하면 자동으로 id가 할당되며, x와 y의 객체 id를 출력하기 위해 id() 함수를 이용합니다.
두 객체 id가 각각 140307489102736, 140307489101536로 할당된 걸 확인할 수 있습니다.
Mutable한 객체는 동일한 값을 가진 값을 변수에 할당할 때 할당되는 주소가 다릅니다.
마지막으로 Mutable한 변수의 lifetime을 보면
print(id({1, 2, 3}))
print(id({1, 2, 3}))
x = {1, 2, 3}
print(id(x))
print(id({1, 2, 3}))
# 140592716422032 # 140592716422032 # 140592716422032 # 140592716420832 (객체 id가 달라짐)
Mutable한 객체는 {1,2,3}에 대해 변수를 할당하지 않았지만 메모리에는 올라왔고 (객체 id를 반환하기 때문에)
아직 {1,2,3} 객체의 lifetime이 끝나지 않아 (호출된 main함수가 종료되지 않아 {1,2,3}이 메모리에서 해제X)
id({1,2,3})과 x 변수 id를 출력할 때 모두 동일한 객체 id가 나옴을 확인할 수 있습니다.
x 변수에 {1,2,3}을 할당한 뒤 다시 id({1,2,3})을 호출하면 이전 {1,2,3}은 x에 할당됐기 때문에 새로운 {1,2,3} 객체 id를 반환합니다. (위 x, y에 {1, 2, 3}을 할당했는데 id 값이 다르다는 점을 참고하세요)
3. Immutable - tuple
x = (1, 2, 3)
y = (1, 2, 3)
print(f"x id: {id(x)}, y id: {id(y)}")
# x id: 140190735140176, y id: 140190735140176
x와 y객체를 생성하면 자동으로 id가 할당되며, x와 y의 객체 id를 출력하기 위해 id() 함수를 이용합니다.
두 객체 id가 140190735140176로 동일한 id 값이 할당된 걸 확인할 수 있습니다.
4. Immutable - str
x = "test"
y = "test"
print(f"x id: {id(x)}, y id: {id(y)}")
# x id: 140566270002608, y id: 140566270002608
x와 y객체를 생성하면 자동으로 id가 할당되며, x와 y의 객체 id를 출력하기 위해 id() 함수를 이용합니다.
두 객체 id가 140566270002608로 동일한 id 값이 할당된 걸 확인할 수 있습니다.
마지막으로 Immutable한 변수의 lifetime을 보면
print(id("test"))
print(id("test"))
x = "test"
print(id(x))
print(id("test"))
# 140493957023152 # 140493957023152 # 140493957023152 # 140493957023152 (객체 id 위와 동일)
Immutable한 객체 test에 대해 변수를 할당하지 않았지만 메모리에는 올라왔고 (객체 id를 반환하기 때문에)
아직 test 객체의 lifetime이 끝나지 않아 (호출된 main함수가 종료되지 않아 test가 메모리에서 해제 X)
id(test)와 x 변수 id 그리고 x에 할당한 뒤 id(test) 했을 때 모두 동일한 객체 id가 나옴을 확인할 수 있습니다.
(위 x, y에 test를 할당했는데 id 값이 같다는 점을 참고하세요)
Immutable한 객체인 test는 동일한 주소에 할당되기 때문에 2.mutable -set의 lifetime에서 확인한 결과와 다른 결과가 나옵니다.
Mutable과 Immutable에 따른 차이를 꼭 숙지해주세요.
최대한 쉽게 설명하고자 했지만 이해되지 않는 부분이나, 내용이 잘못된 부분은 댓글 부탁드립니다.
감사합니다.
댓글
댓글 쓰기