Python(파이썬) 기본 - 26. 함수의 인자(Argument) 전달

아래 내용은 공부한 것을 정리하므로 틀린 내용이 포함되어 있을 수 있습니다.

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