파이문

Python 은 call-by-value 일까 call-by-reference 일까 본문

Python/Python

Python 은 call-by-value 일까 call-by-reference 일까

민Z 2018. 6. 26. 21:58

파이썬 call-by-value 일까 call-by-reference 일까

(Python call by value vs call by reference)



결론부터 말하자면 passed by assignment 라고 한다.


즉, 어떤 값을 전달하느냐에 따라 달라지는 것이다.


파이썬의 자료형엔 크게 immutable(불변) 과 mutable(가변) 이 있다.

int, str 같은 타입이 불변이고 list, dictionary 같은 타입이 mutable 이다.


불변 타입의 객체를 넘기면 call by value 가 되고 가변 타입의 객체를 넘기면 call by reference 가 된다. 즉 할당 되는 것에 따라 전달 방식이 달라지는 것이다.


어떻게 이것이 가능할까?


바로 파이썬에선 모든 것이 객체이기 때문이다.

그래서 int 타입의 변수(객체) 를 함수의 인자 값으로 넘기면 이 객체는 불변 이기 때문에 함수 안에서는 새로운 값을 생성한다.

이는 마치 call-by-value 처럼 보이게 한다! 호출할 때 쓰인 변수 A와 함수 내의 A'는 서로 다른 값을 갖게 되니까!


하지만 가변 객체는 말이 달라진다.

새로 값을 만들 필요가 없기 때문에 레퍼런스만 유지 되서 call-by-reference 처럼 보이는 것이다.


그렇기에 파이썬은 passed by assignment 라고 한다.


이는 코딩 할 때도 잘 생각해야 하는데, 섣불리 가변 객체를 넘겼다가 예상치 못한 결과(함수 안에서 값 바꿨는데 밖에 영향이 있구 막 그런 경우 ㅠㅠ)가 나올 수도 있게 되기 때문이다. 

그래서 파이참 같은데서는 함수에 keyword arguments로 리스트 같은 걸 할당하면 노~란 줄이 뜬다.


pythonic 한 방법은 보통 그런 경우 None으로 값을 주고 내부에서 None일 때 리스트로 할당해주기도 한다.


갓택오버플로

https://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference

'Python > Python' 카테고리의 다른 글

파이썬 모듈 경로 우선순위  (0) 2021.01.26
Python 문자열  (0) 2018.01.14
파이썬 딕셔너리의 키  (0) 2017.08.19
파이썬에서 언더바의 의미  (0) 2017.01.17
파이썬 클래스 상속  (0) 2017.01.16
Comments