-- 어느 블로그
Java는 Call by value, Ruby는 Call by reference. Python은 둘 다 아님. 공식 manual에는 call by assignment라고 되어 있음.(call by object, call by object reference라는 말도..) 그것이 무엇인지 이해하기 위해서는 일단 Python에선 모든 것이 객체(object)이고, 그 객체에는 2가지 종류가 있다는 것을 알아야 함.
immutable object
immutable object인 int, float, str, tuples 등이 함수 arguments로 넘어갈 땐 call by value로 넘어감. subprogram에서 formal parameter 값들이 아무리 바뀌어도, actual parameter에는 영향이 없음.
mutable object
list, dict, set 와 같이 mutable object가 argument로 넘어가면 object reference가 넘어가서 담고 있는 값이 바뀔 수도 있음.
-- 내 반론
immutable이나 mutable이나 call by reference로 넘어간다.
단, 이후 해당 변수에 새로 할당할 때 immutable이 새로운 객체로 변신할 뿐(이부분은 파이썬의 기초)
증거는 아래와 같음
def test(string):
print(id(string)) # 140659604510008
string = 'new world'
print(id(string)) # 140659604514032
string = 'word'
print(id(string)) # 140659604510008
test(string)
으잉? 자바는 콜바이벨류일 때랑 레퍼런스 일때의 조건이 다른거지 둘다이지 않나 - return 0;
ㄴ 자바는 내가 잘 모르겠다 ㅋㅋ
내가 알기로 인자를 레퍼런스 하면 레퍼런스인데 거기다 어싸인먼트를 하면 밸류로 바뀌는걸로 알고 있는데 파이썬도 그렇지 않은지 확인을 - return 0;
ㅇㅇ 너 말이 맞음
변경불가능성이 기준이 아님 ㅇㅇ
내가 알기론 numeric 외엔 모두 레퍼런스 대입으로 알고있어
ㄴ 지금 확인해보니 numeric도 마찬가지다. 넘긴 직후에는 id 같네. ㅎㅎ
아그래? 그건 몰랐네
다시 보니까 블로그 글에서 말하려고 하는건 값 변경시에 원래 변수에 부작용이 생기냐 안생기냐를 말하려고 하는것 같어
ㄴ 글 목적 자체는 그게 맞는 것 같음. 다만 설명 과정에서 인수 넘기는 방식에 대한 오해를 만들 수 있기에..
사실 실제 쓸 때는 mutable이냐 immutalble이냐만 신경쓰면 되기는 하지.
결론은 자바랑 똑같다는거네 - return 0;