2010-05-13 8 views
156

저는 파이썬을 처음 접했기 때문에 이것은 간단한 범위 지정 질문 일 것입니다. 파이썬 파일 (모듈)에서 다음 코드는 나를 약간 혼란 :if 문에서 초기화 된 변수의 범위는 무엇입니까?

내가에서 근무했습니다 다른 언어
if __name__ == '__main__': 
    x = 1 

print x 

,이 코드가 예외를 슬로우의 x 변수가 if 문에 로컬 및 예상대로 그것 밖에 존재하지 않는다. 그러나이 코드는 실행되고 인쇄됩니다. 1. 아무도이 동작을 설명 할 수 있습니까? 모듈에 생성 된 모든 변수는 전체 모듈에서 전역 변수로 사용할 수 있습니까?

+7

위의 if 문이 참이 아닌 경우 (예 : 모듈을 가져 오지 않고 모듈을 가져올 때와 같이 (예 :'__name__은 * not *' '__main __'') 최상위 레벨),'x'는 절대로 바운드되지 않을 것이고, 후속'print x' 문은'NameError : name 'x'not not defined'를 던질 것입니다. – Santa

답변

155

파이썬 변수는 할당 된 가장 안쪽의 함수, 클래스 또는 모듈로 범위가 지정됩니다. ifwhile 블록과 같은 제어 블록은 계산되지 않으므로 if에 할당 된 변수는 여전히 함수, 클래스 또는 모듈로 범위가 지정됩니다. 람다 표현식처럼 발전기의 발현 또는 목록/설정/DICT 이해 에 의해 정의

(암시 적 기능 당신은 그 어떤으로 할당 문을 물건 수 없습니다., 수를 할 수 있지만, 람다 매개 변수와 for 절 목표는

36

예, 그들은 같은 "로컬 범위"에있어, 실제로 이런 코드는 파이썬에서 일반적입니다 :

if condition: 
    x = 'something' 
else: 
    x = 'something else' 

use(x) 

x 선언하거나 것처럼, 조건 전에 초기화되지 않도록주의 예를 들어, C 또는 Java가 될 수 있습니다.

즉, 파이썬에는 블록 수준 범위가 없습니다. 분명히 NameError 예외를 발생시킬 것 같은

if False: 
    x = 3 
print(x) 

같은 예제와 함께,하지만주의해야합니다.

1

예. for 범위의 경우에도 마찬가지입니다. 그러나 물론 기능이 아닙니다.

예 : if 문에서 조건이 거짓 인 경우 x은 정의되지 않습니다.

1

이 코드를 명령 줄에서 실행하면 if 조건이 참이고 x이 설정됩니다. 비교 : 파이썬에서

>>> if False: 
    y = 42 


>>> y 
Traceback (most recent call last): 
    File "<pyshell#6>", line 1, in <module> 
    y 
NameError: name 'y' is not defined 
28

범위 순서로 다음과

  • 는 로컬 범위

  • 검색 둘러싸 기능의 범위를 검색

  • 글로벌 범위를 검색

  • 내장 검색

(source)

if 다른 루핑 공지 것을/분기 구조가 나열되지 - 클래스 만, 기능 및 모듈 파이썬 범위를 제공하며, 그래서 if 블록 선언 아무것도 가지고 동일한 범위 그 블록 밖에서는 아무것도 몰라요. 컴파일시 변수가 검사되지 않기 때문에 다른 언어에서 예외가 발생합니다. 파이썬에서는 변수가 필요할 때 존재하면 예외는 발생하지 않습니다.

5

Eli가 말했듯이, Python은 변수 선언을 요구하지 않습니다.C에서는 다음과 같이 말합니다 :

int x; 
if(something) 
    x = 1; 
else 
    x = 2; 

파이썬 선언에서 암시 적이므로 x에 지정하면 자동으로 선언됩니다. 파이썬은 동적으로 타입이 지정 되었기 때문에 정적으로 타입이 지정된 언어에서는 작동하지 않습니다. 사용 된 경로에 따라 변수가 선언되지 않고 사용될 수 있기 때문입니다. 이것은 정적으로 타입이 지정된 언어로 컴파일 될 때 잡힐 것이지만 동적으로 타입이 지정된 언어에서는 허용됩니다.

정적으로 입력 된 언어는이 문제로 인해 if 외부의 변수를 선언해야하는 유일한 이유입니다. 역동을 포용하십시오!

7

C와 같은 언어와 달리 Python 변수는 함수 (또는 클래스 또는 모듈)의 전체 범위를 나타내며, 가장 안쪽의 "블록"에 표시됩니다. 함수 (또는 클래스 또는 모듈)의 맨 위에 int x을 선언 한 것과 같습니다. 단, Python에서는 변수를 선언 할 필요가 없습니다.

변수 x의 존재는 런타임에만 - 즉 print x 문에 도달 할 때 검사됩니다. __name__"__main__"과 같지 않은 경우 예외 : NameError: name 'x' is not defined이 표시됩니다.

+0

클래스는 범위를 만들지 않습니다. 클래스의 "local"변수는 생성시 클래스의 dict에 간단히 추가됩니다. – chepner

관련 문제