2012-08-10 5 views
1

루프 내부에있는 경우 루프의 후속 반복 중에 조작 할 개체를 인스턴스화하고 루프의 범위가 남아있을 때 사용할 수 있습니까? 여기 변수 선언을 잊어 버림

내가 작동 할 수 무슨 생각의 간단한 예입니다 :

>>> for i in range(2): 
... r = [] if r is None else r 
... r.append[i] 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
NameError: name 'r' is not defined 

을 그리고 여기에 나가서 설명하자면 NameError 예외를 사용하여 내 두 번째 시도입니다 :

>>> for i in range(2): 
... try: 
...  r = r 
... except NameError: 
...  r = [] 
... r.append(i) 
... 
>>> 

내가 무슨 노력 해왔다 의심을 do는 실제로 금지되어 있지만, 왜 그렇게 될지 이해하지 못합니다.

누군가 나를 위해 약간의 빛을 던질 수 있습니까?

편집 :

그래서 두 번째 방법은 작동하지만, 그것은 매우 긴 호흡입니다. 빠른 방법이 있습니까?

+0

나는 그것이 질문의 요점을 무너 뜨린다는 것을 알고 있지만 물론 루프 전에 그것을 인스턴스화 할 수 있습니까? – Ben

+0

루프를 만들기 전에'r = []'을 정의하는 것보다 어떤 이점이 있습니까? – DSM

+0

@Ben과 DSM은 부분적으로 첫 번째 시도에서 작동하는 것에 만족합니다! 또한 정의를 잊어 버리기 때문에 코드 입력을 중단하지 않아도됩니다. 또한, 나는 보통 무언가가 작동하는지 만보고 있으며, 나는 그것 때문에 많은 것을 다시 타이핑하는 것처럼 보입니다. – jon

답변

3

: 귀하의 질문에 대해서는 name in locals() : 나는 이그나시오 바스케스 - 에이 브람스에 동의

>>> 'r' in locals() 
False 
>>> for i in range(2): 
    if 'r' not in locals(): r = [] 
    r.append(i) 


>>> r 
[0, 1] 
>>> 

; 이것은 좋은 스타일이 아닙니다. 루핑하기 전에 필요한 것을하십시오.

+1

+1 이것은 훌륭한 대답입니다. 나는 코드에서 그리고 인터프리터에서 재생할 때만 사용하지 않을 것을 약속한다 :-) – jon

6

아니요, 적극적으로 권장하지 않습니다. NameError이 아니어야합니다. 극단적 인 상황을 제외하고는 잡힐 수 있습니다. 항상 None 경우에도 루프 외부에서 이름을 바인딩하십시오.

이름이처럼 지역 주민에있는 경우 당신은 알 수
+0

방금 ​​괄호 대신 대괄호를 사용하는 것으로 나타났습니다 ... 따라야 할 업데이트 ... – jon

+0

@ 존 : 내 대답은 의미합니다. –

관련 문제