/* 본 게시물은 ' ' 의 내용과 참고자료를 토대로 작성되었습니다. */
/* 본 글은 개인적으로 공부한 내용을 정리한 글이므로 오류가 있을 수 있습니다. */
참고 자료
[원썸지니의 별책부록 - 파이썬 함수 인자 전달시 변겨오디는 객체] : https://jinisbonusbook.tistory.com/50
기본적으로 함수에 객체를 인자로 넘기면 새로운 지역 변수가 생성되고 원래 객체를 복사하지 않고 참조만 하게 된다.
만일 함수 안에 있는 어떤 변수에 새로운 객체를 연결한다면 함수 바깥에는 영향을 끼치지 않는다. 그런데 함수를 인자로 전달할 때 전달된 인자가 영향을 받는 부분이 있다.
파이썬에서는 불가변객체(immutable), 가변객체(mutable)이 있다.
가변 객체 : 객체의 값을 수정 가능하다. 리스트, 집합, 딕셔너리 등이 있다.
불가변 객체 : 객체의 값을 수정불가능하다. 숫자형 , bool, 문자열, 튜플 등이 있다.
우선, 불가변객체 예시를 보자.
def test(num):
num = num + 1 #지역변수 num = 매개변수 num + 1
return num
def test2(num):
num + 1
if __name__ == "__main__":
num = 0 # 전역변수
test(num)
print(num) # 0
test2(num)
print(num) # 0
불가변객체는 참조주소 안에 있는 data를 변경할 수 없다. 따라서 전역변수에는 영향을 끼치지 않는다.
id()를 통해 확인해보자.
def test2(num):
print(id(num)) #매개변수 num id
num = num + 1 #지역변수 num
print(id(num)) #지역변수 num id
다음으로 가변 객체 예시이다.
def append_element(list, element):
list.append(element)
if __name__ == "__main__":
data = [1, 2, 3]
#1
print(id(data))
append_element(data, 4)
print(data) # [1, 2, 3, 4]
#2
print(id(data))
#1의 id 값과 #2 의 id 값은 동일하다. 참조주소는 같고 안에 있는 데이터를 추가했다는 것을 알 수 있다.
그러면 함수 인자로 준 가변 객체를 그대로 두고 새로운 가변 객체를 만들때는 어떻게 할 수 있을까?
copy library의 deepcopy()를 이용하면 된다.
def append_element2(list, element):
list1 = copy.deepcopy(list)
print(id(list))
print(id(list1))
list1.append(element)
return list1
if __name__ == "__main__":
data = [4, 5, 6]
append_element2(data, 7)
print(data) # [4, 5, 6]
deepcopy()를 통해 list의 값을 복사해온다. (list와 list1의 메모리 주소는 다름)
*shallow copy() 와 deepcopy() 의 차이는 다음 글을 참고하길 바란다.