2009-03-26 2 views
2

지역 구성원()을 생성/수정하는 것이 함수 내에서 작동하지 않는 이유는 무엇입니까?Python : locals()를 사용하여 함수 내에서 현재 범위를 수정할 수없는 이유는 무엇입니까?

Python 2.5 (release25-maint, Jul 20 2008, 20:47:25) 
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 

>>> # Here's an example of what I expect to be possible in a function: 
>>> a = 1 
>>> locals()["a"] = 2 
>>> print a 
2 

>>> # ...and here's what actually happens: 
>>> def foo(): 
... b = 3 
... locals()["b"] = 4 
... print b 
... 
>>> foo() 
3 
+1

왜 이런 종류의 작업을 수행 하시겠습니까? –

+0

외부 적으로 가져온 데이터를 사용하여 변수로드를 초기화하려고합니다. 그래서 내 생각은 : 1 모든 변수를 "= None"으로 선언하십시오. 2 varname -> 외부 소스 경로 매핑을 작성하십시오. 3 맵을 반복하고, 변수를 설정하거나 오류로 중단하십시오. 그러나 변수를 설정하는 데 문제가 있습니다. – RobM

+0

낡은 질문을 되살려 죄송합니다. 동일한 것을하고 싶습니다 : 나는 딕트가 있고, 딕트의 모든 요소를 ​​지역 변수로 바꾸고 싶습니다. (그래서 options.foo 대신 foo라고 말할 수 있습니다). 지금 eval을 사용하여이 작업을 수행하고 있지만 추한 것입니다. 다른 방법이 없습니까? – GaryO

답변

7

왜 그렇습니까? 표현을 반환하도록 설계되었으며 현지인을 편집 할 의도가 없었습니다. documentation 경고와 같이 그러한 도구로 사용할 수있는 것은 결코 보장되지 않습니다.

+0

아, 온라인 도움말() 만 읽었 기 때문에 놓쳤습니다. 감사. – RobM

+0

@Devin, 그것은 당신이 비슷한 방식으로 전역을 수정할 수 있기 때문에 가장 놀랄만 한 행동이 될 것이기 때문에. – allyourcode

+1

이것은 공정한 불만입니다. 파이썬이 로컬 액세스를 불가능하게하는 방식으로 로컬 액세스 속도를 높이기 때문에 전역 네임 스페이스가 그런 최적화를하지는 않지만 (예 : PEP 266과 같이 제안되었지만)이 방법은 효과적입니다. 그것은 틀림없이 사라져야하는 새는 추상화입니다. 개인적으로 선호하는 방법은 전역()이 이제는 전역()처럼 작동하도록하기보다는 지역()이 현재와 같은 방식으로 작동하도록하는 것입니다. 어쨌든, 제 대답은 직관에 대한 언급보다는 문서에 대한 비열한 참조였습니다. 문서가해야한다고 말하지 않기 때문에 그렇게하지 않을 것입니다. –

3

locals()는 네임 스페이스의 복사본을 반환합니다 (네임 스페이스의 복사본은 globals()가 수행하는 것과 반대입니다). 즉, locals()에 의해 반환 된 사전에 수행 한 변경 사항은 아무런 효과가 없습니다. 예제 4.12에서 dive into python을 체크인하십시오.

+0

그것들은 문서가 아니며, 그것은 Python으로 다이브입니다. –

+0

당신 말이 맞아요 :) –

관련 문제