Python 3 딜레마
Python 3에서 다음 코드 스 니펫은 예상대로 로컬 변수를 업데이트하지 못합니다 :
def f () : a = 1 exec ( "a = 3") print (a) 예상되는 '3'대신 '1'! Python 2의 동일한 코드는 실제로 로컬 변수를 업데이트하여 '3'을 인쇄합니다. 이 불균형은 Python이 지역 변수를 처리하는 방식의 근본적인 변화에서 비롯됩니다.
def f(): a = 1 exec("a = 3") print(a)
Python 3은 현지 변수를 냉동 배열로 저장합니다. 컴파일 시간에. 이 효율성은 현지인에게 런타임 수정을 금지하는 비용으로 발생합니다. 따라서 Python 3의 기본 exec 호출은 로컬 변수를 성공적으로 변경할 수 없습니다.
locals의 마법 ()
현지인 사전을 명시 적으로 통과시킨다. 이 사전은 동적 코드를 실행 한 후 업데이트 된 로컬 변수를 저장합니다. 수정 된 코드는 다음과 같습니다.
def foo () : ldict = {} exec ( "a = 3", globals (), ldict) a = ldict
def foo(): ldict = {} exec("a = 3", globals(), ldict) a = ldict['a'] print(a)
exec ()
에 대한 시사 예측할 수없는 행동. 안전을 위해서는 로컬 변수를 업데이트 할 때 항상 명시적인 현지인 사전을 Exec에 전달해야합니다.
Python
Georg Brandl의 통찰력있는 의견에 대한 호기심 많은 최적화 버그 보고서는 로컬 변수에 대한 Python 3의 최적화로 현재 동작이 발생했음을 강조합니다. Custom Exec 기능을 Python 자체와 구별 할 수없는 컴파일러는 특별한 치료를 제공 할 수 없습니다. 따라서 기본 exec는 로컬을 변경할 수 없습니다.
Python 2의 예외
이전 Exec 문은 다르게 작동했습니다. 이를 통해 Compiler의 내장 실행에 대한 특수 처리로 인해 로컬 변수를 동적으로 수정할 수있게되면
결론
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3