• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    해결됨

선생님, 질문이 있습니다.

21.07.31 12:40 작성 조회수 93

0

선생님, 안녕하세요??

문득 Python에서의 call by value 방식에 대해 궁금증이 생겼습니다.

임의의 1차원(차원은 크게 상관없습니다만) 배열(혹은 행렬) x가 있을 때

np.sort(x) : x라는 1차원 배열의 복사본을 sort함수의 인자로 전달하여 np 라이브러리의 sort 함수의 결과(정렬배열)을 리턴

x.sort() : x라는 1차원 배열의 원본에 대해 정렬을 수행 -> 따라서 원본을 가지고 연산하였기 떄문에 원본이 정렬된 결과로 바뀜

이라고 말할 수 있을까요?

그리고

 만일 엄청난 크기의 배열을 정렬해야 한다고 가정할 때 call by value는 효율적이지 못하기 때문에 C에서의 포인터처럼 call by reference를 쓴다고 저는 배웠는데

파이썬에서는 저런 복사 비용을 감내하여도 그냥 진행을 하게 되는지 여쭙고 싶습니다. 

감사합니다~~!!

답변 1

답변을 작성해보세요.

0

안녕하십니까, 

1. np.sort(x) : x라는 1차원 배열의 복사본을 sort함수의 인자로 전달하여 np 라이브러리의 sort 함수의 결과(정렬배열)을 리턴

x.sort() : x라는 1차원 배열의 원본에 대해 정렬을 수행 -> 따라서 원본을 가지고 연산하였기 떄문에 원본이 정렬된 결과로 바뀜

=> np.sort(x)가 복사본을 sort함수의 인자로 전달하는지, 아니면 함수내에서 복사본을 만들고 이를 반환하는지는 소스코드를 까보지 않아서 잘 모르겠습니다. 이런 궁금증을 가지시게 된 이유가 이게 call by reference, call by value 인지 여부에 대한 궁금증에서 출발하셨을 거라고 생각이 됩니다. 

기본적으로 python의 함수 인자 전달 방식은  call by reference 입니다. 다만 int, str과 같이 immutable(불변)한 변수인 경우일 때만 call by value입니다.  

2. np.sort(x)가 메모리를 많이 소모하지만, 필요하다면 당연히 사용해야 합니다. 다만 물리적인 메모리 제약이 있다면 다른 부분에서 로직을 보다 효과적으로 사용해서 메모리 사용을 줄여야 할 것 입니다. 

감사합니다.