[파이썬] 함수의 인자 전달, mutable, immutable 객체

Bini by Bini·2023년 2월 5일
0

파이썬

목록 보기
1/4

지역변수

  • 함수 내에서 선언된 변수
  • 함수 안에서만 사용 가능

전역변수

  • 함수 밖에서 선언된 변수
  • 모든 함수에서 사용 가능

함수의 인자 전달

주로 다루고자 하는 내용은 이부분이다.

코딩테스트 준비를 하던 중 전역변수로 선언한 부분을 함수에서 다루었을 때에 대한 의문이 생겨 찾아보게 되었다.

1. 변수, 객체, 주소

  • 파이썬의 모든 타입은 객체이다.
  • 변수에 객체를 할당하면 특정 메모리 주소 공간을 할당받게 된다.
  • 그리고 그 변수를 다시 다른 변수에 대입하게 되면 같은 주소를 바라본다.
>>> a = 5
>>> id(a)
4396632240
>>> b = a
>>> id(b)
4396632240
  • 다시 a에 새로운 값을 할당하고 id값을 확인하면 a 값이 바뀌고, a의 주소가 변경된다.
    -> 이렇게 immutable 객체인 int, float, string, tuple은 값에 변화를 주면 재할당이 되므로 자연스럽게 메모리 주소가 변경된다.
>>> 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

Immutable vs Mutable
파이썬 객체에는 수정 가능한 타입도 있고, 수정 불가능한 타입이 있다.
수정 불가능한 객체를 immutable 객체, 수정 가능한 객체를 mutable 객체라고 한다.

구분타입
Immutable 객체int, float, str, tuple
Mutable 객체list, dict

더 자세히 보려면 ! https://wikidocs.net/91520

2. 함수의 인자 전달

  • 함수에 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 function(d):
...     d.append(10)
...     return d

>>> c = [1, 5]
>>> e = function(c)

>>>id(c)
4404828936
>>>id(e)
4404828936
profile
My Precious Records

0개의 댓글