-
[python]네임스페이스 및 메모리 레퍼런싱Data관련/Python 2023. 10. 22. 13:33
파이썬은 모든 것을 객체로 다루는 언어입니다. 변수는 이러한 객체를 참조합니다. 이때 파이썬의 네임스페이스가 중요한 역할을 합니다. 네임스페이스는 변수 이름과 해당 변수가 참조하는 객체의 메모리 주소를 저장하는 테이블로 생각할 수 있습니다.
X = 2023
위의 코드에서, X는 변수이며, 2023은 int 객체입니다. X는 2023이라는 int 객체를 참조하게 됩니다. 이때, 네임스페이스에는 다음과 같이 정보가 저장됩니다.
이름 레퍼런싱된 객체 메모리 주소
X 0x151dfe6a0b0 이후, 만약 Y = X라고 한다면, Y는 X가 가리키는 메모리 주소를 참조합니다. 즉, X와 Y는 동일한 객체를 가리키게 됩니다.
Y = X
이름 레퍼런싱된 객체 메모리 주소
X 0x151dfe6a0b0 Y 0x151dfe6a0b0 이때, hex(id()) 함수로 메모리 주소를 확인하거나, X is Y와 같은 비교를 통해 두 변수가 동일한 객체를 참조하는지 확인할 수 있습니다.
변수와 네임스페이스는 파이썬에서 다른 개념입니다.
변수는 값을 저장하고 참조하는 식별자입니다. 변수는 객체를 참조하며, 해당 객체의 메모리 주소를 저장합니다. 변수는 다른 변수와 동일한 객체를 참조할 수도 있습니다.
네임스페이스는 변수 이름과 해당 변수가 참조하는 객체의 메모리 주소를 저장하는 테이블입니다. 네임스페이스는 파이썬에서 변수 이름과 실제 객체 사이의 매핑을 제공합니다.
네임스페이스는 변수가 객체를 참조할 때 사용되는 테이블이며, 변수의 이름과 해당 변수가 참조하는 객체의 메모리 주소를 저장합니다. 변수는 네임스페이스를 통해 해당 객체를 식별합니다.
변수의 네이밍 규칙
변수의 이름을 짓는데에도 몇 가지 규칙이 존재합니다.
- 변수 이름은 숫자로 시작해서는 안 됩니다.
- 소문자로만 작성하는 것이 관례입니다.
- 파이썬의 키워드(reserved words)를 변수 이름으로 사용해서는 안 됩니다 (예: print, int, str).
- 변수 이름은 언더스코어(_)로 시작할 수 있습니다.
- 변수 이름을 가능한한 의미 있게 작성하여 코드의 가독성을 높이는 것이 좋습니다.
메모리와 레퍼런싱
파이썬에서 변수는 객체를 참조하는데, 이는 메모리와 관련이 있습니다. 변수를 생성하고 해당 변수를 객체에 연결하면, 객체의 메모리 주소가 저장됩니다. 이 메모리 주소를 통해 변수는 해당 객체를 식별합니다.
공유 레퍼런싱(shared referencing)의 예를 들어보겠습니다.
list1 = [100, 200, 300] list2 = list1
위 코드에서, list1과 list2는 동일한 리스트 객체를 참조합니다. 따라서, 두 변수는 동일한 객체를 가리키고 있습니다.
이후, 새로운 리스트를 생성한 후 변수에 할당하는 경우:
list1 = [100, 200, 300] list3 = [100, 200, 300]
여기서 list1을 볼 때, 먼저 int 객체를 생성한 이후에 100,200,300의 인스턴스 객체를 생성합니다
list1을 보면, 먼저 int 객체를 생성한 후에 100, 200, 300의 인스턴스 객체를 생성합니다.
그 이후에 list Class 인스턴스 객체를 생성합니다. 생성하면서 100, 200, 300의 int 클래스와 연결시키면서 int 인스턴스 클래스의 카운터가 1씩 증가하는 것을 볼 수 있습니다.
그리고 변수를 생성하고, 변수와 list 클래스를 연결시키는 과정을 거칩니다. 연결하면서 list 클래스의 인스턴스 객체의 카운터가 1을 증가합니다.
그리고 list2 = list1의 과정을 진행하면 변수를 생성하고, list2와 list1의 class 인스턴스 객체와 연결을 시키면서 카운터가 1이 증가하여 카운터가 2가 됩니다.
여기서 list3를 [100, 200, 300]으로 생성하면 어떻게 될까요?
list Class 인스턴스 객체를 생성합니다. 그리고 기존에 있던 int class 객체를 사용하면서 int class 카운터가 1씩 증가하게 됩니다.
그 이후에 새로운 변수 list3를 생성하고 변수와 리스트 객체를 연결시킵니다.
그리하여 list1과 list3는 서로 다른 list 클래스 인스턴스 객체로 생성됩니다.
list1과 list3는 서로 다른 객체를 가리키게 됩니다.
이를 확인하기 위해 == 연산자로 두 객체의 값이 같은지를 비교하고, is 연산자로 두 변수가 동일한 객체를 가리키는지를 확인할 수 있습니다.
print(list1 == list3) # True (값은 같음) print(list1 is list3) # False (서로 다른 객체)
이런 식으로 파이썬의 네임스페이스, 변수, 메모리 관리, 그리고 레퍼런싱에 대한 기본 개념을 익혀보았습니다.
'Data관련 > Python' 카테고리의 다른 글
[python]객체지향 프로그래밍 및 데이터타입 (2) 2023.10.21 파이썬 인터프리터와 실행 과정 이해하기 (1) 2023.10.21 프로그래밍 언어: 컴퓨터와의 대화의 시작 (0) 2023.10.17