2013-05-12 4 views
4

내가 파이썬에서 범위 지정으로 장난 내가 오히려 이상한 생각 뭔가 발견 :이 파이썬 글로벌 스코핑 매직의 논리는 무엇입니까?

g = 5 

def foo(a): 
    if a: 
     global g 
     g = 10 
    else: 
     g = 20 


print("global g: ",g) 

foo(False) 
print("global g: ",g) # 20?! What? 

foo(True) 
print("global g: ",g) 

내 두 번째 인쇄 있었어야이 있다고 생각을 "5"세계 문이 실행되지 않았기 때문에,하지만, 출력은 20입니다 (!).

이 논리는 무엇입니까?

+0

: 작업 주위 globals() 기능을 사용하는 것입니다

A (읽기 하드 및 비 파이썬) 'dis' 모듈로 주위를 둘러보십시오. (최상위 레벨에서'global'으로'foo'를 정의한 후에'if.dis (foo)'를 시도하십시오. – abarnert

+1

실제로 dis 모듈을 사용 했으므로 g = 20이 글로벌 범위에 포함되었습니다. 그러므로 나는 주어진 대답을 의심했지만 확신을 원했다 :) – monoceres

답변

7

키워드는 파이썬 컴파일러에 의해 전역으로 기능 범위에서 이름을 표시하는 데 사용됩니다.

함수의 아무 곳에서나 사용하면 해당 이름은 더 이상 로컬 이름이 아닙니다.

if은 새 범위를 도입하지 않으며 함수와 모듈 만 (클래스, 목록, 사전 및 집합 포함이 함수 범위의 특별한 경우 임) 유의하십시오. 이 물건 장난에 관심이 있다면, 당신은 바이트 코드의 기초를 배워야한다

def foo(a): 
    if a: 
     globals()['g'] = 10 
    else: 
     g = 20 
+1

파이썬에서 (C와 친구들과 달리)'if' 블록은 새로운 범위가 아니라는 것을 지적 할 가치가있다; 그'global' 명령문의 범위가 함수입니다. – abarnert

+0

흥미 롭습니다. 나는 파이썬 같은 동적 인 언어에서 이것을 기대하지 않을 것이다. 이 결정이 이루어진 이유에 대한 논의가 있습니까? – monoceres

+0

@abarnert : 참으로; * 확장 된 것은 새로운 범위를 만듭니다. –