Python은 C언어와 다르게 Pointer가 존재하지 않는다.

Pointer란

프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다. 포인터가 가리키는 값을 가져오는 것을 역참조라고 한다.

python에서는 메모리 주소를 변수를 구별하는 용도로 사용한다.

참고로 변수의 메모리 주소는 id()를 이용하여 구할 수 있다.

a = "String"
id(a)

python에서는 변수에 값을 할당하면 object를 생성해서 값을 저장한 후 변수는 해당 object의 메모리 주소를 의미하는 id값을 가지게 된다. 여기서 변수는 object의 label정도로 생각하면 된다.

>>> a = 1
>>> id(a)
23282008

다음과 같은 두 가지 상황을 생각해 볼 수 있다.

  • 같은 object 값을 가지고 같은 메모리 주소를 가지는 경우

    >>> a = b = 100
    >>> id(a)
    23283616
    >>> id(b)
    23283616
    

    이 경우 변수 a를 변화시킨다면, 주소값도 같이 변한다.

    >>> a += 1
    >>> a
    101
    >>> id(a)
    140706122743760
      
    >>> b
    100
    >>> id(b)
    140706122743728 # b의 주소값은 변하지 않는다.
      
    >>> b += 1
    >>> id(b)
    140706122743760 # a와 같은 주소값을 가진다.
      
    >>> b -= 1
    >>> id(b)
    140706122743728
    
  • 같은 object 값을 가지고 다른 메모리 주소를 가지는 경우: 같은 주소값을 가질수도 안가질 수도 있다.

    >>> a = 12345
    >>> b = 12345
    >>> id(a)
    23564368
    >>> id(b)
    23564584
      
    

    따라서 두 변수를 비교할 때는 해당 값을 비교하는 것인지, object의 id를 가르키는 것인지 명확히 해야한다.

    >>> a = 12345
    >>> b = 12345
    >>> id(a)
    23564368
    >>> id(b)
    23564584
    >>> a is b # object id 비교
    False
    >>> a == b # object value 비교
    True
      
    

정체성 , 동질성

  • 동일한 객체를 참조하는 사례: dict 자료형

    dict 자료형의 경우, 변수 선언을 기존의 dict 형 변수로 할 경우 동일한 object를 참조하게 되며, 하나의 값이 변하면, 다른 하나의 변수도 같이 변하게 된다.

    >>> A = {"a": 1, "b": 2, "c": 3}
    >>> B = A
    >>> A is B # 같은 object
    True
    >>> A == B 
    True
      
    >>> A['d'] = 4 # A에 key 'd' 추가
    >>> B # A의 변화가 B에도 반영
    {'a': 1, 'b': 2, 'c': 3, 'd': 4}
      
    
  • 위의 두 변수를 독립적으로 사용하기 위해서는 아래와 같이 서로 다른 object를 참조해야 한다.

    >>> A = {"a": 1, "b": 2, "c": 3}
    >>> B = {"a": 1, "b": 2, "c": 3}
    >>> A is B # 서로 다른 object 참조
    False
    >>> A == B
    True
    

Reference

  • https://technote.kr/185
  • https://technote.kr/289
  • https://zzsza.github.io/development/2018/08/25/python-object/