2017-09-07 10 views
8

모듈은 실행의 어떤 지점에서 정의 된 이름과 같이 해당 컨텍스트를 추적하기위한 사전을 보유합니다. 이 사전은 module을 가져온 경우 vars(module) (또는 module.__dict__)를 통해 액세스, 또는 모듈 자체에 locals 내장 함수를 호출하여 할 수 있습니다지역 사전이 언제 설정됩니까?

업데이트하고 현재 지역 심볼 테이블을 나타내는 사전을 반환합니다.

하지만 기능에서 지역 사전에 액세스하려했을 때 혼란 스러웠습니다. 스크립트가 독점적으로 다음을 포함하는 경우

def list_locals(): 
    print(locals()) 

list_locals() 

그러나 다른 한편으로

는, 출력이 __name__, __doc__을 포함, 예상되는 사전이고, 다른 모듈 : 만 다음을 포함하는 스크립트의 출력은 빈 사전입니다 수준 변수 :

print(locals()) 

그렇다면 지역 사전의 내용은 언제 설정됩니까? 또한 locals 함수의 정의에서 "업데이트"의 의미는 무엇입니까?

+0

모듈 수준에서'print (locals() is globals())' –

+0

@Chris_Rands 그래, 그건 내 혼란의 일부였다. –

답변

7

모듈의 네임 스페이스는 globals()을 통해 액세스되는 전역 네임 스페이스입니다. 별도의 지역 네임 스페이스가 없으므로 함수 외부에있는 locals()은 전역 네임 스페이스를 반환합니다.

함수에만 로컬 네임 스페이스가 있습니다. locals()은 해당 네임 스페이스의 단방향 반영입니다. 함수에 대한 CPython 구현은 고도로 최적화되어 있으므로 locals() 사전을 통해 로컬 변수를 추가하거나 변경할 수 없습니다. locals()에 의해 반환 된 사전은 해당 함수에 대한 호출간에 네임 스페이스가 변경 될 때마다 업데이트됩니다.

list/dict/set comprehensions, generator expressions 및 class bodies와 같은 것이 네임 스페이스 규칙이 다르긴하지만 실제로는 함수로 실행된다는 점에 유의하십시오. 이러한 상황에서 locals()은 별도의 함수 로컬 네임 스페이스도 반환합니다.

+1

평소처럼, consice and clear, thanks! –

1

동일한 함수 호출 중에 locals()을 두 번 이상 호출하면 동일한 사전을 반환합니다. 이 경우

>>> def f(): 
...  d = locals() 
...  assert 'd' not in d 
...  locals() 
...  assert 'd' in d 
...  assert d is locals() 
...  print(d) 
... 
>>> f() 
{'d': {...}} 

"업데이트"이 사전의 내용이 존재하는 지역 변수의 현재 범위를 반영하기 위해 업데이트되지만이 사전에 대한 참조를 유지하는 경우 그 사전이 계속 사용되는 것을 의미한다.

locals 사전에는 'f'에 대한 키가 포함되어 있지 않습니다 (기능 도중 현지인 사전에 액세스 할 수 있음). 분명하지 않은 경우, 그것은 지역이 아닌 글로벌입니다.

+0

"업데이트"의 의미에 대해 설명해 주셔서 감사합니다. 분명히 '지역'과 '전역'을 섞어 보았지만, 그 문서가 그 행동에 대해 다소 회피 적이라고 말하고 싶습니다. 설명을 다시 해 주셔서 감사합니다. –