Python 부분 변수 필드 에서 코드 실행
사용 범위 내 에서 코드 세 션 을 실행 하고 싶 으 며 실행 후 모든 결과 가 보이 지 않 기 를 바 랍 니 다.
해결 방안
이 문 제 를 이해 하기 위해 서 먼저 간단 한 장면 을 시험 해 보 세 요.우선,전역 네 임 스페이스 에서 코드 세 션 을 실행 합 니 다.
>>> a = 13
>>> exec('b = a + 1')
>>> print(b)
14
>>>
그리고 한 함수 에서 같은 코드 를 실행 합 니 다.
>>> def test():
... a = 13
... exec('b = a + 1')
... print(b)
...
>>> test()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in test
NameError: global name 'b' is not defined
>>>
마지막 에 네 임 에 러 이상 을 던 진 것 은 재exec()
문구 가 실 행 된 적 이 없 는 것 과 같다.뒤의 계산 에서exec()
실행 결 과 를 사용 하고 싶다 면 문제 가 생 길 것 이다.이러한 오 류 를 수정 하기 위해 서 는 호출
exec()
전에 locals()
함 수 를 사용 하여 부분 변수 사전 을 얻어 야 합 니 다.그 후에 부분 사전 에서 수 정 된 변수 값 을 가 져 올 수 있 습 니 다.예 를 들 면:
>>> def test():
... a = 13
... loc = locals()
... exec('b = a + 1')
... b = loc['b']
... print(b)
...
>>> test()
14
>>>
토론 하 다.실제로
exec()
의 정확 한 사용 은 비교적 어렵다.대부분의 경우 사용exec()
을 고려 해 야 할 때 더 좋 은 해결 방안(예 를 들 어 장식 기,폐쇄,원류 등)도 있다.그러나 만약 당신 이 여전히 exec()를 사용 하려 고 한다 면,이 절 은 그것 을 정확하게 사용 하 는 방법 을 보 여 줍 니 다.기본 적 인 상황 에서 exec()는 호출 자 부분 과 전체 범위 에서 코드 를 실행 합 니 다.그러나 함수 에서 exec()에 전달 되 는 부분 범 위 는 실제 부분 변 수 를 복사 하여 구 성 된 사전 입 니 다.따라서 exec()가 수정 작업 을 수행 하면 이러한 수정 후의 결 과 는 실제 부분 변수 값 에 영향 을 주지 않 습 니 다.다음은 다른 예 입 니 다.
>>> def test1():
... x = 0
... exec('x += 1')
... print(x)
...
>>> test1()
0
>>>
위의 코드 에서 부분 변 수 를 호출 locals()
할 때 exec()
에 전 달 된 부분 변 수 를 복사 합 니 다.코드 가 실 행 된 후에 이 사전 의 값 을 심사 하면 수 정 된 값 을 얻 을 수 있 습 니 다.다음은 프 리 젠 테 이 션 예 입 니 다.
>>> def test2():
... x = 0
... loc = locals()
... print('before:', loc)
... exec('x += 1')
... print('after:', loc)
... print('x =', x)
...
>>> test2()
before: {'x': 0}
after: {'loc': {...}, 'x': 1}
x = 0
>>>
마지막 출력 을 자세히 살 펴 보 세 요.loc 에서 수 정 된 값 을 x 에 수 동 으로 할당 하지 않 으 면 x 변수 값 은 변 하지 않 습 니 다. locals()
을 사용 할 때 는 조작 순서 에 주의해 야 한다.호출 될 때마다locals()
부분 변수 값 의 값 을 가 져 오고 사전 에 해당 하 는 변 수 를 덮어 씁 니 다.아래 이 실험의 출력 결 과 를 주의 깊 게 관찰 하 십시오.
>>> def test3():
... x = 0
... loc = locals()
... print(loc)
... exec('x += 1')
... print(loc)
... locals()
... print(loc)
...
>>> test3()
{'x': 0}
{'loc': {...}, 'x': 1}
{'loc': {...}, 'x': 0}
>>>
>>> def test3():
... x = 0
... loc = locals()
... print(loc)
... exec('x += 1')
... print(loc)
... locals()
... print(loc)
...
>>> test3()
{'x': 0}
{'loc': {...}, 'x': 1}
{'loc': {...}, 'x': 0}
>>>
마지막 호출locals()
시 x 의 값 이 어떻게 덮어 지 는 지 주의 하 십시오. locals()
의 대안 으로 사전 을 사용 하여exec()
에 전달 할 수 있 습 니 다.예 를 들 면:
>>> def test4():
... a = 13
... loc = { 'a' : a }
... glb = { }
... exec('b = a + 1', glb, loc)
... b = loc['b']
... print(b)
...
>>> test4()
14
>>>
대부분의 경우 이런 방식 은 사용exec()
의 가장 좋 은 실천 이다.전역 과 부분 사전 이 뒤의 코드 에 접근 할 때 초기 화 되 었 음 을 보증 해 야 합 니 다.또 하 나 는 사용
exec()
하기 전에 더 좋 은 대안 이 있 는 지 물 어 봐 야 할 수도 있다.대부분의 경우 exec()
를 사용 하 는 것 을 고려 해 야 할 때 더 좋 은 해결 방안 도 있다.예 를 들 어 장식 기,폐쇄,메타 류 또는 다른 메타 프로 그래 밍 특성 등 이다.이상 은 Python 이 부분 변수 필드 에서 코드 를 실행 하 는 상세 한 내용 입 니 다.Python 부분 변수 필드 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.