2011-11-18 2 views
6

왜 이러한 경우가 나는 입력이 이제 10이 될 것이라고 생각파이썬이 모든 것을 참고로 통과했다고 생각 했나요?

#module functions.py 
def foo(input, new_val): 
    input = new_val 

#module main.py 
input = 5 
functions.foo(input, 10) 

print input 

다음 코드를 가지고?

+0

함수 foo의 정의에서 지역 변수 "input"을 호출하면 혼란을 느낄 수 있습니다. 또한 스벤이 대답에서 말한 것. – phkahler

+6

파이썬이 모든 것을 참조로 전달한다는 것을 읽은 곳이라면 누구나 틀 렸습니다. –

답변

13

모든 것이 값으로 전달되지만 그 값은 원래 개체에 대한 참조입니다. 개체를 수정하면 변경 내용이 호출자에게 표시되지만 이름을 다시 지정할 수는 없습니다. 게다가, 많은 객체는 불변 (ints, float, strings, tuples)입니다.

+8

"[이디엄 파이썬] (http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables)"이 현상을 잘 설명합니다. –

+1

파이썬은 call-by-value 나 call-by-reference가 아니며 자세한 내용은 내 대답을 참조하십시오. –

+1

@skyhisi : 귀하의 대답은 본질적으로 광산과 동일합니다. 비표준 용어 인 "객체 별 호출"을 사용하는 것을 제외하고는, 나는 그것이 의도적으로 피할 수없는 anythin을 설명합니다. –

8

foo에서 로컬 이름 input을 다른 객체 (10)에 바인딩합니다. 호출 컨텍스트에서 input 이름은 여전히 ​​5 개체를 참조합니다.

5

파이썬에서의 할당은 현재 위치에서 객체를 수정하지 않습니다. input = new_val 다음에 로컬 변수 input이 새로운 값을 갖도록 이름을 리바 인합니다.

def foo(input, new_val): 
    input[0] = new_val 

foo([input]) 

파이썬 패스 - 참조하지 않는 : 당신이 input은 "외부"를 수정하려면

, 당신은 하나의 요소 목록으로 변경 가능한 객체의 내부를 포장해야합니다 C++ 참조 전달 방식과 정확히 일치합니다.

// effectively a no-op! 
void foo(object *input, object *new_val) 
{ 
    input = new_val; 
} 
+0

답장을 보내 주셔서 감사합니다 ... 제안한이 방법은 해킹과 비슷한 것처럼 보입니다. 표준 절차입니까? 거기에 더 pythonic 불변의 유형을 수정하는 다른 방법이 있습니까? ('불변의 타입을 수정하면 내 자신의 질문에 답할 것 같아.하지만 어쨌든 물어 보겠습니다.) – Ferguzz

+0

@Ferguzz 정의에 따라 불변의 오브젝트를 수정할 수 없습니다. 하지만 그게 진짜로 네가 물어 보려고 한거야? 지금까지 불변 객체는 언급조차되지 않았다. 'var = ...'이 어떤 객체 나 다른 변수를 수정하지 않는다는 사실은 불변성과는 아무런 관련이 없습니다. 한 목록을 변경하여 다른 목록에 영향을 줄 수없는 것처럼 한 변수 할당이 다른 변수를 변경하도록 할 수 없습니다. – delnan

+0

나는이 답변의 줄을 '목록과 같은 변경 가능한 객체 안에 감싸는 것'이라고 말하고있었습니다. 내가 물어 보려고했는데,이 일을하지 않고 내 원래 게시물 에서처럼 변수를 수정할 수있는 방법이 있습니까? – Ferguzz

3

파이썬도 호출에 의한 값, 또는 통화에 의해 참조, 그것은 Call By Object입니다 : 모든 인수는 C/C++에서 포인터 인 것처럼 적어도이 경우에는 더.

"인수는 유사한 인수가 객체 하고 그들이 변경할 경우에만 변경 될 수 제외 호출 별 값 에, 호출에 의해 공유에 의해 전달됩니다."

+1

좋은 요약,하지만 여전히 나는 call-by-object가 call-by-value와 다를 바 없으며 모든 "values"는 객체에 대한 핸들 (~ = 포인터)이다. – Kos

관련 문제