본문 바로가기

교육 노트/파이썬 강의

[파이썬 때려잡기] Python 강의 18 - 함수 인자 변경

2018/09/04 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 1 - Hello World!

2018/09/04 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 2 - 변수와 자료형, 연산자

2018/09/05 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 3 - 파이썬의 자료구조, 리스트 (list)

2018/09/05 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 4 - 파이썬의 스트링 (string)

2018/09/05 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 5 - 스트링과 리스트 처리-1

2018/09/05 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 6 - 스트링과 리스트 처리-2

2018/09/05 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 7 - 튜플 (tuple)

2018/09/05 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 8 - 딕셔너리 (Dictionary)

2018/09/08 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 9 - 집합 (set)

2018/09/08 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 10 - 사용자 입출력

2018/09/09 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 11 - 변수와 메모리

2018/09/09 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 12 - 조건과 조건문(분기문)

2018/09/09 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 13 - 반복문 while문

2018/09/10 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 14 - 반복문 for문

2018/09/12 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 15 - 함수와 프로시져

2018/09/14 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 16 - 함수 - 디폴트 및 키워드 인수

2018/09/14 - [교육 노트/파이썬 강의] - [파이썬 때려잡기] Python 강의 17 - 함수 - 전역변수, 지역변수


파라미터들을 함수 내에서 수정하면 어떻게 될까?

기본적으로 프로그램이 난잡해지는것을 막기위해서 대부분의 프로그램들은

call by value 를 기본으로 값만 넘어가서 함수내에서 수정하는것이 함수 밖에 영향을 끼치지 않는다.



1. call by value (pass by value)

def modify_arguments(s,n,l):
s = "after string"
n = 11
l = [5,6,7,8]
l += [5,6,7,8]
print ("함수내:" + s )
print ("함수내:" + str(n))
print ("함수내:" + str(l))


s = "before string"
n = 10
l = [1,2,3,4]


modify_arguments(s,n,l)
print (s)
print (n)
print (l)


함수내:after string
함수내:11
함수내:[5, 6, 7, 8, 5, 6, 7, 8]
before string
10
[1, 2, 3, 4]

s,n,l 의 값을 전부 변경해보았더니 함수내부에서는 분명 변경되었지만 함수 외부에서 넘어간 변수 자체는 변경되지 않았다.



메모리 구조를 보여주는 http://pythontutor.com/visualize.html 에서 해당 코드를 돌려보면 확실히 알수있다.


2. 참조형

위에 코드를 http://pythontutor.com/visualize.html 에서 돌려보면 s와 n는 넘어갈때 바로 값이 복사되지만

list의 경우 같은 리스트를 가리키는것처럼보인다.

빨간줄 코드가 실행되기 전까지는 같은 리스트를 가르키고 있다.

string이나 number는 immutable 하기 때문에 값이 바로 복사되지만이렇게 리스트와 같이 mutable (변경가능) 한 자료형은 참조형으로 넘어가게 된다.

참조형으로 넘어간다는것은 해당 리스트 자체가 넘어간다고 생각하면 편하다.



def modify_arguments(s,n,l,l2):
s = "after string"
n = 11
l = [5,6,7,8]
l2 += [5,6,7,8]



s = "before string"
n = 10
l = [1,2,3,4]
l2 = [1,2,3,4]


modify_arguments(s,n,l,l2)
print (s)
print (n)
print (l)
print (l2)



before string
10
[1, 2, 3, 4]
[1, 2, 3, 4, 5, 6, 7, 8]

다음과 같이 l2의 경우 5,6,7,8이 원본 변수자체 뒤에 추가 된것을 확인할수있다.

mutable 한 자료형은 함수 내에서 원본 변수의 수정이 가능하다.

그러나 l과 같이 새로 대입을 하는경우 새로운 리스트를 만들게 되므로 새로운 리스트를 만든이후로는 원본 리스트가 수정되지 않는다.




728x90