일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 튜토리얼
- OOM
- scala
- 문제풀이
- docker
- 주키퍼
- 코드워
- boj
- DP
- redis
- Java
- zookeeper
- HBase
- 자바
- golang
- 알고리즘
- 프로그래머스
- Python
- Go언어
- 파이썬
- gradle
- Linux
- codewars
- programmers
- dynamic programming
- leetcode
- 스칼라
- go
- 리눅스
- 동적프로그래밍
- Today
- Total
파이문
Python 은 call-by-value 일까 call-by-reference 일까 본문
파이썬 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 |