[파이썬]함수의 매개변수를 사용할때의 주의사항

파이썬에서 함수 사용에 있어서 주의해야할 점들을 정리한다. 여기서 정리할 주의점들의 대부분은 가변형과 불변형 데이터라는 특징에 의해서 발생하는 것들이다. 즉, 파이썬 자료형의 특성들을 깊게 이해하고 있으면 발생하지 않을 문제라고 생각한다.

#1 기본적인 함수의 매개변수 사용

1
2
3
4
5
6
7
8
def sum(a, b):
a += b
return a

a = 1
b = 2
print(sum(a, b)) # 3
print(a, b) # 1 2

매우 기본적인 사용법이다.

#2 가변형 데이터를 매개변수로 사용

1
2
3
4
5
6
7
8
9
10
def sum(a, b):
a += b
return a

a = [1, 2]
print(a) # [1, 2]
b = ['a', 'b']
print(sum(a, b)) # [1, 2, 'a', 'b']
a # [1, 2, 'a', 'b']
b # ['a', 'b']

리스트는 더하기 연산을 지원하기 때문에 그에 맞은 연산 결과를 반환한다. 그리고 다시 a와 b 변수의 내용을 출력하면 a의 값이 변경된 것을 볼 수 있다.

변수 a가 변경된 이유는 값이 아닌 참조가 넘어갔기 때문이다. 이는 파이썬이 데이터를 효율적으로 사용하기 위한 조치이다. a의 데이터가 1억개 있다고 가정해보자. 함수 안에서 연산을 위해 1억개의 데이터를 모두 메모리에 올려놓고 사용한다면 리소스의 낭비가 심해질 것이다.

#3 불변형 데이터를 매개변수로 사용

1
2
3
4
5
6
7
8
9
10
def sum(a, b):
a += b
return a

a = (1, 2)
b = ('a', 'b')

print(sum(a, b)) # (1, 2, 'a', 'b')
a # (1, 2)
b # ('a', 'b')

리스트를 넘겼을때와 다르게 원본 a, b가 변하지 않았다. 튜플같이 불변형 데이터를 함수의 인자로 줄 때에는 참조를 넘겨주는 것이 아니라 실제 값을 복사해서 넘겨주기 때문이다. 값을 복사해서 넘겨주기 때문에 데이터의 크기가 크다면 퍼포먼스에 영향을 줄 수 있으므로 상황에 맞는 자료형을 사용해야 한다.

#4 참조를 반환하는 불변형

str / bytes / frozenset / tuple : 사본을 생성하지 않고 참조를 반환한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
a = (1, 2, 3)
aa = tuple(a)
aaa = a[:]

print(a is aa) # True
print(a is aaa) # True
id(a), id(aa), id(aaa) # (4592214160, 4592214160, 4592214160)

b = 'abcd'
bb = 'abcd'

print(b is bb) # True
id(b), id(bb) # (4592243072, 4592243072)

불변형 자료형의 경우 값이 같을때 항상 같은 객체를 참조한다.


정리

데이터 타입이 가변형 / 불변형인지에 따라 특성이 달라지기 때문에 유의해서 사용해야한다. 함수의 매개변수로써 리스트가 쓰이면 참조 주소가 넘어가기 때문에 원본에도 영향을 끼치며 불변형인 튜플이 쓰이면 값 그 자체를 넘기게 된다.

[참고]
패스트캠퍼스 강의

Share