2011-05-13 4 views
1

아래의보고를하십시오 역 추적 (마지막으로 가장 최근 통화) : 파일 "C :/사용자/사용자/문서/파이썬에서는 순서가 바뀌지 만 다른 것들은 쓸 수없는 이유는 무엇입니까?

a = 5 
print a + b 
b = 4 

나는 위의 코드를 실행하려고, 에러를 제공합니다 modules/ab.py ", 줄 2, 인쇄 a + b NameError : 이름 'b'가 정의되지 않았습니다.

확인. b이 정의되기 전에 a + b이 호출됩니다. 즉, Python은 위에서 아래로 시작하여 코드를 순서대로 실행합니다. 하지만, 어떻게 이것에 대해 :

class Data: 
    def __init__(self): 
     self.debug_level = 9 
     self.assign = [0, 0, 0, 0] 
     self.days = 0 
    def create_days(self, startTime, endTime): 

     res = 0 
     try: 
      if self.final_days < self.maximum_days: 

, self.final_daysself.maximum_days는 하나 아직 정의되지 않은,하지만 오류를 제공하지 않습니다. 그것 뒤에있는 논리는 무엇입니까? 클래스를 정의 할 때 속성에 액세스하지 않기 때문에 그것은 오류를 제공하지 않습니다

+1

"정의"와 "평가"의 구분을 이해합니까? 그걸 먼저 들여다보고 ** 당신의 질문을 ** 업데이트하여 혼란이 무엇인지 설명 할 수 있습니까? –

+0

먼저 전화해야합니다. – riza

+0

'create_days'가 실행되기 전까지 정의됩니다. – tzot

답변

4

감사합니다. create_days()으로 전화하는 즉시 문제가 생길 것입니다 : D

2

함수의 본문은 정의 된 때가 아니라 호출 될 때 평가됩니다.

1

참조는 코드가 실행될 때만 조회됩니다. create_days() 메소드에 원하는 이름을 넣을 수 있으며, 그 이름을 포함하는 행이 실행될 때까지 아무 것도 검사되지 않습니다.

+0

즉, self_final_days 및 self.maximum_days는 create_days()가 호출되기 전에 값을 가져야합니다. – alwbtc

+1

예. 그렇지 않으면 의미가 없습니다. – Joe

5

실제로 코드를 "실행"하고 있지는 않습니다. 귀하의 예제에서는 Data 클래스 안에 메서드 선언 만 있으면됩니다. 파이썬에서는 클래스 필드의 존재 여부를 검사하지 않을 것입니다. 왜냐하면 다른 시간에 설정 될 수 있기 때문입니다 (파이썬의 클래스는 그 의미에서 가단성이 있습니다).

Data 클래스의 새 인스턴스에서 create_days 메서드를 실행하려고하면 해당 필드의 값을 미리 설정하지 않으면 오류가 발생합니다. 당신이 실제로 그것을 실행하는 경우

1

, 당신은 AttributeError를 얻을 것입니다 : 데이터 인스턴스는 어떤 속성 'final_days'

이 재현하지 않으려면이 있습니다

x = Data() 
x.create_days(1,2) 

또한, 당신이 try 블록을 가지고있다. 이 코드는 다른 코드에서 발췌 한 것입니다. try 블록이 아마 예외를 삼키는 것입니다.

0

파이썬은 C++과 달리 컴파일 된 언어가 아니므로 함수 본문은 호출 될 때까지 평가되지 않습니다.

관련 문제