2016-06-18 1 views
0

J'ai un morceau de code comme ça plus bas.Python: Pourquoi deux variables globales ont des comportements différents?

Avec ce code je reçois un:

local variable 'commentsMade' referenced before assignment 

Pourquoi ai-je besoin d'une déclaration « commentsMade globale » dans la première fonction mais je ne ai pas besoin de TARGET_LINES? (En utilisant python2.7)

TARGET_LINE1 = r'someString' 
TARGET_LINE2 = r'someString2' 
TARGET_LINES = [TARGET_LINE1, TARGET_LINE2] 
commentsMade = 2 

def replaceLine(pattern, replacement, line, adding): 

    #global commentsMade # =========> Doesn't work. Uncommenting this does!!!! 

    match = re.search(pattern, line) 
    if match: 
     line = re.sub(pattern, replacement, line) 
     print 'Value before = %d ' % commentsMade 
     commentsMade += adding 
     print 'Value after = %d ' % commentsMade 
    return line 

def commentLine(pattern, line): 
    lineToComment = r'(\s*)(' + pattern + r')(\s*)$' 
    return replaceLine(lineToComment, r'\1<!--\2-->\3', line, +1) 

def commentPomFile(): 
    with open('pom.xml', 'r+') as pomFile: 
     lines = pomFile.readlines() 
     pomFile.seek(0) 
     pomFile.truncate() 

     for line in lines: 
      if commentsMade < 2: 

       for targetLine in TARGET_LINES: # ===> Why this works??? 

        line = commentLine(targetLine, line) 

      pomFile.write(line) 

if __name__ == "__main__": 
    commentPomFile() 

Répondre

1

Si vous faites une affectation à une variable dans le corps d'une fonction, puis Python traite la variable locale (à moins que vous déclariez global). Si vous lisez simplement la valeur dans le corps d'une fonction, sans lui affecter, alors elle recherche la variable dans une portée plus élevée (par exemple, la fonction parente ou globale). Donc dans votre cas, la différence est que vous attribuez à commentsMade, ce qui le rend local, mais vous ne l'attribuez pas à TARGET_LINES, donc il cherche une définition globale pour cela.