for e in collections: pass
for 루프에서 마지막 객체 e는 항상 컨텍스트에 존재합니다. 루프 외부에서도 e에 대한 후속 참조는 여전히 유효합니다.
여기서 쉽게 간과할 수 있는 문제가 있습니다. 루프 이전에 동일한 이름의 개체가 이미 존재하는 경우 해당 개체를 덮어쓰게 됩니다.
코드 인식 IDE를 사용하는 경우 IDE는 변수가 "재선언되었습니다"라는 메시지를 표시하지만 런타임 중에는 오류가 발생하지 않습니다.
for 루프는 클로저가 아니며, dis 모듈을 사용하여 보시다시피 다음 코드를 분해할 수 있습니다.
x = 5 for x in range(10): pass print x
코드를 test.py 파일을 실행하고 python - m dis test.py
C:UsersPatrickDesktop>python -m dis test.py
1 0 LOAD_CONST 0 ( 5)
3 STORE_NAME 9 LOAD_NAME 1(범위)
12 LOAD_CONST 1 10 > 28 POP_BLOCK
6 >> 29 LOAD_NAME 0 (x)
32 PRINT_ITEM
33 PRINT_NEWLINE
34 LOAD_CONST 2 (없음)
37 RETURN_VALUE
다른 언어에서는 초기화된 변수가 Java와 같은 컨텍스트에서도 표시됩니다. 기존 변수를 선언하면 IDE에서 오류 메시지가 표시됩니다. 물론 컴파일과는 다릅니다.
보통 Python 프로그래밍(아마도 대부분의 동적 언어)에서는 같은 이름의 변수를 선언해도 프로그램에서는 뚜렷한 오류가 없지만, 일단 오류가 발생하면 찾기 어려운 경우가 있습니다. 오류. 따라서 for 루프의 변수와 동일한 이름을 사용하지 마십시오.
{{ page.name if page else ''}}
상위 페이지> >
{{ page.markdown if page else ''}}
여기서 문제는 작업 중 오류가 발생하여, 프롬프트는 할당 전 에서 참조한 오류 페이지입니다.
너무 어지러워서 오류를 찾느라 밤새도록 보냈습니다. 마지막으로 for 루프의 페이지 이름을 실행하기 전에 _page로 변경했습니다.
템플릿 호출 과정에서 템플릿 언어도 파이썬 바이트코드로 변환해서 한 줄씩 파싱해서 출력하기 때문에 토네이도에 버그인지는 전혀 모르겠습니다. 템플릿 언어.요컨대 토네이도의 예외 추적은 매우 불친절하다고 생각합니다.
파이썬에서 변수의 범위 검색 순서: 로컬 범위(Local) → 현재 범위가 포함된 로컬 범위(Enclosing locals) → 전역/모듈 범위(Global) → 내장 범위(Built) ) -in)