파이썬 컴파일러는 컴파일 타임에 함수가 액세스하고있는 barenames가 로컬인지 (즉, 함수 내에 할당 된 바알 마임 또는 다른 방법으로 바인딩되어 있는지)를 인식하여 로컬 변수에 대한 액세스를 최적화합니다. 그래서 당신이 경우 코드 :
def lv1(d):
locals().update(d)
print zap
컴파일러가 barename zap
가 (기능 lv1
에 할당되지 않은) 그래서 대신 글로벌로 액세스하는 코드를 컴파일 지역이 아니다 "알고있다"- 어떤 d
포함하지 않습니다 문제. 컴파일러 키워드 exec
을 볼 때, 그것은 당신이 당신의 코드가 아니라, 천천히 부풀어 및 버그 만들려고 노력하는 거 알아 - 당신이 느리고 비 대한 코드를 선호하는 경우
, 당신은 함수 내부에 exec
을 사용하여 최적화를 물리 칠 수 있습니다 가능한 한 최적화하고 어떤 식 으로든 최적화하지 않음으로써 협력합니다.
그래서, 다음 코드는 사용자가 원하는대로 작동합니다 : 당신이 원하는대로
def lv1(d):
exec ""
locals().update(d)
print zap
lv1({'zap': 23})
이 23
을 방출한다.
나는이 기술이 권장되지 않는 위의 "무표정한 유머"분명 희망,하지만 난 더 나은 아주 명시 적으로 맞추는 것 : print locals()['zap']
대신 print zap
를 작성하는 반신 반의하는 구문 즐거움을 위해, 당신은을 지불하고 성능 측면에서 상당한 가격.그래도 실제 경험이 풍부한 전문가 수준의 프로그래머가 실제로 무엇을하고 있는지, 왜 그런지 알고있는 희귀 한 경우에는 유용 할 수있는 모든 종류의 위험한 도구와 마찬가지로 exec
을 사용하거나 (또는 잘못 사용하여) 당신의 변덕에 서 : 파이썬은 당신의 길에 서 있지 않습니다! -)
너 진짜하려고? – SilentGhost
'locals [ "size"]'가 아닌 변수를 직접 액세스하고 싶습니다. – Geo
큰 그림은 무엇입니까? 아마 더 좋은 방법이있을 것입니다. – sykora