2010-06-01 4 views
1

foo는 = "foo는" 데프 바 (foo는) : foo는 = "바" 파이썬 함수 인수 범위 (사전 V 문자열.)

bar(foo) 
print foo 

# foo is still "foo"... 

foo = {'foo':"foo"} 
def bar(foo): 
    foo['foo'] = "bar" 

bar(foo) 
print foo['foo'] 

# foo['foo'] is now "bar"? 

내가 실수했다 기능을 통해-작성이 내 사전을 통과 할 때 함수 매개 변수를 사용합니다. 내 매개 변수를 상수로 선언 할 수있는 명확한 방법이 있습니까? 아니면 함수 내에서 사전 복사본을 만들겠습니까?

감사합니다.

답변

3

이와 같은 경우 사전을 변경하여 변경 사항을 로컬로 유지하려면 해당 사전을 복사해야합니다.

이유는 두 번째 bar 함수에 사전을 전달할 때 파이썬은 사전에 대한 참조 만 전달하기 때문입니다. 따라서 함수 내부에서 수정하면 함수 밖의 동일한 객체가 수정됩니다. 반면에 첫 번째 bar 함수에서는 foo = "bar"을 쓸 때 함수 내에 foo이라는 다른 개체를 할당합니다. 이렇게하면 함수 안에 foo이라는 이름이 문자열 "bar"을 참조하기 시작하며 문자열 "foo"을 나타내지 않습니다. 이름에서 참조하는 개체를 변경했습니다. 함수 내에서 foo과 함수 외부에있는 foo은 다른 이름이므로 함수 내에 foo이라는 레이블이 붙은 객체를 변경하면 함수 외부에있는 foo 이름에는 영향을주지 않습니다. 그래서 그들은 다른 대상을 가리 킵니다. 나는이 단순히 복사로,

temp_dict = CONSTdict 

도움이되지 않았다 포인터를 추가 할

+0

박람회. 이 키워드를 좀 더 멋지게 만들려면 const 키워드와 같은 것이 있어야합니다. 감사합니다. –

+0

이것은 C++ 학습을 위해 뻔뻔한 플러그를 만들 수있는 지점입니다. 고급 언어에서 이런 종류의 오해 중 절반은 언어 작동 방식에 대한 이해가 부족하기 때문입니다. 약간의 C++를 배울 시간이 있다면, 파이썬에서 이러한 종류의 것들이 그들이 가장 빠르거나 가장 쉬운 구현이기 때문에 그들이하는 방식임을 알게 될 것입니다. 파이썬이 어떻게 작동 하는지를 이해하기 위해 C++을 알 필요는 없지만 더 쉽게 사용할 수 있습니다. –

+0

@Shaun : 파이썬에서는 ('None','True','False','1','2' 등의 키워드 이름을 제외하고는) 아무 것도 실제로는 변하지 않습니다. 어쨌든'const' 키워드는 도움이되지 않을 것입니다 왜냐하면 두 번째'bar()'가'foo'라는 이름의 객체에 대한 연산을 수행하고 있기 때문에 이름이 무엇을 가리키는 지 바꾸지 않기 때문입니다. 'const'는 전자가 아니라 후자를 막습니다. Timothy는 C++ (또는 C)를 배우는 것이 아마도 이것을 명확하게하는 데 도움이 될 것이라는 점을 잘 알고 있습니다. –

1

인수는 값으로 전달되지만이 경우 값은 개체에 대한 참조입니다. 이것은 call by sharing이라고도합니다. 그래서 예, 새로운 사전이 필요하면 함수에서 하나를 만들어야합니다.

0

.

대신, 필요한 :

temp_dict = dict(CONSTdict) 

건배,

숀 충분히