>  기사  >  백엔드 개발  >  for 루프의 변수 범위에 주의하세요.

for 루프의 변수 범위에 주의하세요.

高洛峰
高洛峰원래의
2016-10-18 09:16:471841검색

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 루프의 변수와 동일한 이름을 사용하지 마십시오.

Python 템플릿 언어로 코딩할 때 특히 그렇습니다. 코드 편집기에는 프롬프트가 없으며 오류가 있는 위치를 찾을 수 없습니다. 이것은 제가 접한 매우 이상한 예입니다. 왜 이상하다고 하시나요, 논리적인 문제가 없으니까.

페이지 템플릿에서 핸들러가 이 템플릿을 호출하면 페이지 객체와 페이지 목록 두 객체(핸들러에서 나는 tornado 사용)가 동시에 전달됩니다. 내 주문은 다음과 같습니다.


{{ page.name if page else ''}}

상위 페이지

>                                                                >

{{ page.markdown if page else ''}}

여기서 문제는 작업 중 오류가 발생하여, 프롬프트는 할당 전 에서 참조한 오류 페이지입니다.

너무 어지러워서 오류를 찾느라 밤새도록 보냈습니다. 마지막으로 for 루프의 페이지 이름을 실행하기 전에 _page로 변경했습니다.

템플릿 호출 과정에서 템플릿 언어도 파이썬 바이트코드로 변환해서 한 줄씩 파싱해서 출력하기 때문에 토네이도에 버그인지는 전혀 모르겠습니다. 템플릿 언어.

요컨대 토네이도의 예외 추적은 매우 불친절하다고 생각합니다.

파이썬에서 변수의 범위 검색 순서: 로컬 범위(Local) → 현재 범위가 포함된 로컬 범위(Enclosing locals) → 전역/모듈 범위(Global) → 내장 범위(Built) ) -in)

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.