2013-08-16 1 views
1

나는 Pythons 변수 범위에 대한 이해를 차단하는 상황을 발견했습니다. 내가다른 UnboundLocalError : 할당 전에 참조 된 로컬 변수 문제

 adapter.addFeatureTransactionToQueue(featureID, result[0], result[1], Command.ADD, boris, trans_id = transaction_id) 

모든 작품과 마지막 줄을 교체 할 경우

transaction_id = None 


def parseFileContent(hostID,marketID, content, writeToDB=False): 
    features = _buildObjects(StringIO.StringIO(content)) 

    for feature in features: 
     featureID = adapter.addFeature(feature.name,boris) 
     print transaction_id #breaks here UnboundLocalError: local variable 'transaction_id' referenced before assignment 

     transaction_id = adapter.addFeatureTransactionToQueue(featureID, result[0], result[1], Command.ADD, boris, trans_id = transaction_id) 

: 여기

는 코드입니다. 첫 번째 시나리오에서 값을 인쇄하는 것에 대해 파이썬이 싫어하는 점을 이해해야합니다.

답변

3

파이썬 컴파일러는에 할당하면 함수 에 로컬로 이름을 표시합니다. 마지막 행은 transaction_id에 할당되므로 전역이 아닌 로컬 이름으로 간주됩니다.

더 할당이없는 경우, 이름 대신 로컬이 아닌 것으로 간주됩니다
def parseFileContent(hostID,marketID, content, writeToDB=False): 
    global transaction_id 

과 :

당신은 transaction_id 함수 내부의 global 키워드를 사용하여, 글로벌입니다 명시 적으로 것을 컴파일러에게 필요 당신은 그것을 표시 할 필요가 없습니다.

2

파이썬에는 변수 선언이 없으므로 어떤 범위의 로컬인지 알 수있는 다른 방법이 필요합니다. global 선언에 의해 재정의되지 않는 한, 함수가 할당하는 모든 것이 그 함수에 국한된다는 것을 정의함으로써 그렇게합니다. 따라서 transaction_id에 할당하면 로컬이되고 print은 할당되지 않은 로컬 인쇄를 시도하고 실패합니다.

0

함수 내부에서 이름을 지정하면 로컬 이름입니다. 파이썬은 같은 이름을 가진 전역 변수를 가지고 있더라도 그 함수를 로컬 함수로만 취급합니다. 이것은 다른 언어와 다르며, 로컬이없는 경우 동일한 이름의 전역이 사용됩니다.

전역 변수는 피해야합니다. 이 경우 귀하의 transaction_id이 전역적일 이유가 없습니다. 따라서 None 지정 을 함수 안에 넣으면됩니다. 함수가 실행 된 후 마지막 트랜잭션 ID에 액세스하려면 함수에서 반환하십시오.

def parseFileContent(hostID,marketID, content, writeToDB=False): 
    features = _buildObjects(StringIO.StringIO(content)) 
    transaction_id = None  # <---------------------- 

    for feature in features: 
     featureID = adapter.addFeature(feature.name,boris) 
     print transaction_id # now works 

     transaction_id = adapter.addFeatureTransactionToQueue(featureID, 
      result[0], result[1], Command.ADD, boris, trans_id=transaction_id) 

    return transaction_id # <---------------------- 
+0

저는 전역 변수를 사용하지 않고이 범위 현상에 의아해했습니다. 나는 가능한 한 간결하게 나의 질문을하기 위해이 예를 요리해야했다. – bioffe

관련 문제