아래 내용은 공부한 것을 정리하므로 틀린 내용이 포함되어 있을 수 있습니다.
1. 변수, 객체, 주소
- 파이썬에서 모든 타입은 객체입니다.
- 변수에 객체를 할당하면 특정 메모리 주소 공간을 할당받게 됩니다.
-
그리고 그 변수를 다시 다른 변수에 대입하게 되면 같은 주소를 바라봅니다.
>>> a = 5 >>> id(a) 4396632240 >>> b = a >>> id(b) 4396632240
- 다시 a에 새로운 값을 할당하고, id값을 확인해봅니다.
- 새로운 변수가 입력되면서, a의 주소가 변경되었습니다.
-
이렇게 단순한 원시값으로 되어있는 int, float나 immutable한 객체인 tuple, string등은 이렇게 값을 변화를 주면 재할당이 되므로 자연스럽게 메모리 주소가 변경이 됩니다.
>>> a = 50 >>> id(a) 4396633680 >>> id(b) 4396632240
- 하지만 mutable한 객체는 앞서 포스트에서도 다루었지만, 내부 값에 변화를 주면 같은 곳을 바라보고 있던 변수는 주소가 바뀌지 않은채 함께 변경됩니다.
- 이 문제가 함수의 인자 전달에서도 동일하게 적용됩니다.
>>> a = [1, 2, 3, 4, 5] >>> b = a >>> id(a) 4404799176 >>> id(b) 4404799176 >>> a.append(6) >>> a [1, 2, 3, 4, 5, 6] >>> b [1, 2, 3, 4, 5, 6] >>> id(a) 4404799176 >>> id(b) 4404799176
2. 함수의 인자 전달
- 함수의 인자전달에서 mutable한 객체의 문제를 살펴봅니다.
- 함수에 mutable한 객체를 인자로 전달하면, 함수내부에서 변형이 이루어지면, 외부에서도 영향을 받게됩니다.
>>> m = [1, 5, 7] >>> def modify(k): ... k.append(10) ... print("k = ",k) ... >>> modify(m) k = [1, 5, 7, 10] >>> m [1, 5, 7, 10]
- mutable한 객체를 수정하는 것이 아니라 재할당하는 경우는 상관없습니다.
- 함수의 인자가 내부에서 다른 주소의 값을 할당받았기때문에, 변수 r의 주소의 데이터는 변경되지 않습니다.
>>> r = [10, 15, 20] >>> def replace(s): ... s = [25, 30 ,35] ... print("s =", s) ... >>> replace(r) s = [25, 30, 35] >>> r [10, 15, 20]
- 함수에서 return 받아서 변수에 할당이 되어도 마찬가지 입니다.
>>> def f(d): ... return d ... >>> c = [1, 5] >>> e = f(c) >>> id(c) 4404828936 >>> id(e) 4404828936