나는 문제가 다음과 같은 기능을 잘못 무슨 일이 일어나고 있는지 이해의 비트에 봉착 :파이썬 바르() 전역 이름 오류
>>> ness()
4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in ness
NameError: global name 'yum' is not defined
: 나는이 결과를 얻을 실행하면 그래서
def ness():
pie='yum'
vars()[pie]=4
print vars()[pie]
print yum
을 내가 함수로 작성하고 단지 명령 줄에서 한 번에 하나 개의 라인을 입력하지
경우 지금처럼 잘 작동 :
>>> pie='yum'
>>> vars()[pie]=4
>>> print vars()[pie]
4
>>> print yum
4
>>>
편집 : yum을 값으로 설정하고 그 값을 출력하는 대신에, 좀 더 복잡하게 만들고 싶다고 가정하고, 몇 가지 함수를 정의하고 입력에 따라 그 중 하나를 호출하려고합니다 :
def ness(choo):
dic={}
dessert=()
dnum=[10,100]
desserts='pie'
dic[dessert]=str(desserts[bisect(dnum,choo)])
vars()[dic[dessert]]()
def p():
print 'ummmm ummm'
def i():
print 'hooo aaaaa'
def e():
print 'woooo'
그래서 내가 전화 할 때 나는 키 오류 얻을 다움 :
>>> ness(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in ness
KeyError: 'p'
지금 내가 약간의 elif 문에이 같은 일을 할 수있어,하지만 난 양분이 너무 일하는 것이 궁금하고 사용하는 경우있어 내가 elifs를 사용하는 것보다 더 효율적일 것입니다 (말하자면 나는 choo의 1000 가지 값을 검사 할 필요가 있습니다).
도움을 주셔서 감사합니다.
exec를 사용하면 위에서 쓴 더 복잡한 예를 볼 수 있습니다 (우리에게 시도하는 것과 같은 주요 오류는 없음). vars와 함께 dict. 정확히 정확히 dict를 exec보다 안전하게 사용합니까? "반환 된 사전을 수정하면 안됩니다 : 대응하는 기호 테이블의 효과가 정의되지 않았습니다" Doe 이렇게하면 exec를 사용하여이 방법을 사용하면 예기치 않은 문제가 발생할 수 있습니다. – Jamie
exec는 예를 들어'exec "os.system ('reboot_your_pc')"과 같은 파이썬 코드를 실행할 수 있으므로 사용하지 않는 것이 가장 좋습니다. – YOU
또한 exec는 혼란스럽게 stacktrace를 줄 수 있으며 명시 적 사전보다 훨씬 느립니다 (처음부터 매번 구문 분석되어야 함). – viraptor