“Python 변수할당의 개념”
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/