referenced before assignment error
Question: i have the following code to create a pygame of snake ( very basic ), to
increase my snakes length i added a statement saying `snakeLength += 1 in line
142` it comes up with an error saying

    
    
    Traceback (most recent call last):
          File "C:/Python27/sjewgou.py", line 142, in <module>
           gameLoop()
          File "C:/Python27/sjewgou.py", line 118, in gameLoop
           if len(snakeList) > snakeLength:
         UnboundLocalError: local variable 'snakeLength' referenced before assignment
    

what do i do ?

my code is as follows

    
    
    import pygame
    pygame.init()
    import time
    import random
    
    white = (255,255,255)
    black = (0,0,0)
    red = (255,0,0)
    green = (0,155,0)
    
    display_width = 800
    display_height = 600
    
    block_size = 10
    FPS = 30
    
    gameDisplay = pygame.display.set_mode((display_width,display_height))
    pygame.display.set_caption("Ssssrikar")
    
    gameExit = False
    lead_x = display_width/2
    lead_y = display_height/2
    
    lead_x_change = 0
    lead_y_change = 0
    
    snakeList = []
    snakeLength = 1
    
    
    font = pygame.font.SysFont(None,25)
    
    clock = pygame.time.Clock()
    
    font = pygame.font.SysFont(None,25)
    
    def snake(block_size,snakelist):
        for elements in snakelist:
            pygame.draw.rect(gameDisplay, green, [elements[0], elements[1],block_size,block_size])
    
    
    
    def message_to_screen(msg,color):
        screen_text = font.render(msg, True, color)
        gameDisplay.blit(screen_text, [display_width/2, display_height/2])
    
    
    
    def gameLoop():
        gameExit = False
        gameOver = False
    
        lead_x = display_width/2
        lead_y = display_height/2
        lead_x_change = 0
        lead_y_change = 0        
    
    
        randAppleX = round(random.randrange(0,display_width-block_size)/10.0)*10.0
        randAppleY = round(random.randrange(0,display_height-block_size)/10.0)*10.0
    
    
    
        while not gameExit:
    
            while gameOver == True:
                gameDisplay.fill(white)
                message_to_screen("Gamer over, press C to play again or Q to quit",red)
                pygame.display.update()
    
                for event in pygame.event.get():
                    if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_q:
                            gameExit = True
                            gameOver = False
                        if event.key == pygame.K_c:
                            gameLoop()
    
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    gameExit = True
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_LEFT:
                        lead_x_change = -block_size
                        lead_y_change = 0
                    elif event.key == pygame.K_RIGHT:
                        lead_x_change = block_size
                        lead_y_change = 0
                    elif event.key == pygame.K_UP:
                        lead_y_change = -block_size
                        lead_x_change = 0
                    elif event.key == pygame.K_DOWN:
                        lead_y_change = block_size
                        lead_x_change = 0
    
            if lead_x >= display_width:
                gameOver = True
            elif lead_x < 0:
                gameOver = True
            elif lead_y >= display_height:
                gameOver = True
            elif lead_y < 0:
                gameOver = True
    
            lead_x += lead_x_change
    
            lead_y += lead_y_change
            gameDisplay.fill(white)
            pygame.draw.rect(gameDisplay, red, [randAppleX,randAppleY,block_size,block_size])
    
    
    
            snakeHead = []
            snakeHead.append(lead_x)
            snakeHead.append(lead_y)
            snakeList.append(snakeHead)
    
            if len(snakeList) > snakeLength:
                del snakeList[0]
    
            snake(block_size, snakeList)
    
    
    
            pygame.display.update()
    
            if lead_x == randAppleX and lead_y == randAppleY:
                randAppleX = round(random.randrange(0,display_width-block_size)/10.0)*10
                randAppleY = round(random.randrange(0,display_height-block_size)/10.0)*10
                snakeLength += 1
    
    
            clock.tick(FPS)
    
    
    
    
    
        pygame.quit()
        quit()
    
    gameLoop()
    


Answer: UnboundLocalError, means your variable is not defined in scope of function.

in you game loop add

    
    
    global snakeLength
    

example:

    
    
    >>> x = 10
    >>> def foo():
    ...     x += 1        #here x is local to foo
    ... 
    >>> foo()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in foo
     UnboundLocalError: local variable 'x' referenced before assignment
    
    >>> def foo():
    ...     global x    # now x is global variable
    ...     x += 1
    ... 
    >>> foo()
    >>> x
    11
    

