반응형
포인터와 참조는 메모리 주소와 객체에 대한 접근을 관리하는 방식으로, 주로 프로그래밍 언어에서 데이터 구조를 다룰 때 사용됩니다.
포인터란?
포인터는 특정 데이터의 메모리 주소를 저장하는 변수입니다. 포인터를 통해 데이터의 위치를 직접 참조하고 수정할 수 있습니다.
참조란?
참조는 변수나 객체를 가리키는 이름입니다. 즉, 실제 데이터가 있는 곳을 가리키는 "주소"와 같은 역할을 합니다. 하지만 직접 데이터가 아니라 그 데이터에 대한 접근 경로를 제공합니다.
예시
num1 = 11
num2 = num1
print("Before num2 value is updated:")
print("num1 =", num1)
print("num2 =", num2)
print("\nnum1 points to:", id(num1))
print("num2 points to:", id(num2))
num2 = 22
print("\nAfter num2 value is updated:")
print("num1 =", num1)
print("num2 =", num2)
print("\nnum1 points to:", id(num1))
print("num2 points to:", id(num2))
[Running]
Before num2 value is updated:
num1 = 11
num2 = 11
num1 points to: 140196725320304
num2 points to: 140196725320304
After num2 value is updated:
num1 = 11
num2 = 22
num1 points to: 140196725320304
num2 points to: 140196725320656
- num1과 num2는 처음에 모두 11을 가리킵니다. 이때 두 변수는 같은 메모리 주소를 참조합니다.
- num2의 값을 22로 변경하면, 이제 num2는 새로운 값에 대한 참조를 가지게 되며, num1은 여전히 11을 가리킵니다. 따라서 두 변수는 서로 다른 메모리 주소를 참조하게 됩니다.
dict1 = {
'value': 11
}
dict2 = dict1
print("\nBefore value is updated:")
print("dict1 =", dict1)
print("dict2 =", dict2)
print("\ndict1 points to:", id(dict1))
print("dict2 points to:", id(dict2))
dict2['value'] = 22
print("\nAfter value is updated:")
print("dict1 =", dict1)
print("dict2 =", dict2)
print("\ndict1 points to:", id(dict1))
print("dict2 points to:", id(dict2))
Before value is updated:
dict1 = {'value': 11}
dict2 = {'value': 11}
dict1 points to: 140196726505216
dict2 points to: 140196726505216
After value is updated:
dict1 = {'value': 22}
dict2 = {'value': 22}
dict1 points to: 140196726505216
dict2 points to: 140196726505216
- dict1과 dict2는 동일한 사전을 참조합니다. 따라서 두 변수의 ID는 동일합니다.
- dict2의 'value'를 22로 변경하면, dict1도 영향을 받습니다. 이는 두 변수가 같은 객체를 참조하기 때문입니다. 결과적으로 dict1과 dict2 모두 {'value': 22}로 업데이트됩니다.
dict3 = {
'value': 33
}
print("\nBefore value is updated:")
print("dict1 =", dict1)
print("dict2 =", dict2)
print("dict3 =", dict3)
print("\ndict1 points to:", id(dict1))
print("dict2 points to:", id(dict2))
print("dict3 points to:", id(dict3))
dict2 = dict3
print("\nAfter value is updated:")
print("dict1 =", dict1)
print("dict2 =", dict2)
print("dict3 =", dict3)
print("\ndict1 points to:", id(dict1))
print("dict2 points to:", id(dict2))
print("dict3 points to:", id(dict3))
Before value is updated:
dict1 = {'value': 22}
dict2 = {'value': 22}
dict3 = {'value': 33}
dict1 points to: 140189746036480
dict2 points to: 140189746036480
dict3 points to: 140189746069888
After value is updated:
dict1 = {'value': 22}
dict2 = {'value': 33}
dict3 = {'value': 33}
dict1 points to: 140189746036480
dict2 points to: 140189746069888
dict3 points to: 140189746069888
dict2가 dict3로 참조를 변경했기 때문에, dict1은 여전히 {'value': 22}을 유지하고, dict2는 이제 dict3과 동일한 값을 참조하게 됩니다.
만약 dict1도 dict3를 참조하게 된다면
dict1 = dict2
print("\nAfter dict1 is updated:")
print("dict1 =", dict1)
print("dict2 =", dict2)
print("dict3 =", dict3)
print("\ndict1 points to:", id(dict1))
print("dict2 points to:", id(dict2))
print("dict3 points to:", id(dict3))
After dict1 is updated:
dict1 = {'value': 33}
dict2 = {'value': 33}
dict3 = {'value': 33}
dict1 points to: 140326917734784
dict2 points to: 140326917734784
dict3 points to: 140326917734784
마지막으로 dict1을 dict2와 동일하게 설정하면, dict1도 dict3을 참조하게 됩니다. 이때 dict1, dict2, dict3의 ID를 확인하여 모든 참조가 동일한 객체를 가리키고 있는지 확인할 수 있습니다.
이렇듯 원래 참조하던 {'value': 22} 객체의 참조 수가 하나 줄어듭니다. 이 객체를 참조하는 변수가 더 이상 없으면, Python의 가비지 컬렉터가 이를 인식하고 메모리에서 제거할 수 있습니다.
반응형
'Computer Science > Python' 카테고리의 다른 글
파이썬 | 링크드 리스트 구현하기 (Prepend, Pop First, Get, Set) - 3 (0) | 2024.09.24 |
---|---|
파이썬 | 링크드 리스트 구현하기 (Constructor, Append, Pop) - 2 (0) | 2024.09.23 |
파이썬 | 링크드 리스트(Linked List) 구조, Big O - 1 (0) | 2024.09.23 |
파이썬 | 객체 지향 프로그래밍(OOP), 클래스(Class), 생성자(Constructor) (0) | 2024.09.22 |
파이썬 | 시간 복잡도(Time Complexity), Big O, O(n), O(n^2), O(1), O(log n), O(a + b) (0) | 2024.09.21 |