2013-10-23 17 views
5

Lavorando su un progetto Python per CS1, e sono arrivato attraverso uno strano problema che né io né il mio coinquilino possiamo immaginare. Lo scopo generale del codice è quello di riempire una griglia di 0 con forme di una certa dimensione usando i numeri per riempire lo spazio, e dobbiamo controllare lungo la strada per assicurarci di non mettere le forme nei luoghi in cui ci sono già delle forme. Ho due funzioni qui, entrambe fanno praticamente la stessa cosa, ma per qualsiasi ragione, quando falsechecker restituisce la lista, la restituisce come NoneType. Perché sta succedendo?Funzione Restituzione di un NoneType in Python?

def falseChecker(binList, r, c, size): 
    sCheck = isSpaceFree(binList, r, c, size) 
    if sCheck == True: 
     for x in range(c, c+size): 
      for y in range(r, r+size): 
       binList[x][y] = size 
     return binList 
    else: 
     c += 1 
     if c > len(binList): 
      c = 0 
      r += 1 
      if r > len(binList): 
       return binList 
     falseChecker(binList, r, c, size) 





def iChecker(binList, blockList): 
    r = 0 
    c = 0 
    for i in blockList: 
     check = isSpaceFree(binList, r, c, i) 
     if check == True: 
      for x in range(c, c+i): 
       for y in range(r, r+i): 
        binList[x][y] = i 
      c += 1 
      if c > len(binList): 
       c = 0 
       r += 1 
       if r > len(binList): 
        return binList 
     else: 
      binList = falseChecker(binList, r, c, i) 

    return binList 

main() 
+3

@Everybody: Esiste un duplicato canonico per il comune "Ho scritto una funzione ricorsiva ma non ho restituito il valore da una delle chiamate ricorsive" domanda? – DSM

+2

Come nota a margine, 'se sCheck:' è migliore di 'se sCheck == True:' in quasi tutte le situazioni (inclusa questa). – abarnert

+0

@abarnert "quasi"? Esiste * qualsiasi * situazione in cui è preferibile '== True'? – lvc

risposta

11

Nel caso in cui sCheck == True è falso, non lo fai return nulla. E in Python, una funzione che non fa esplicitamente riferimento a return restituisce None.

Se si stava tentando di chiamare in modo ricorsivo se stessi e restituire il risultato, si voleva questo:

return falseChecker(binList, r, c, size) 
3

La linea ricorsiva:

falseChecker(binList, r, c, size) 

deve essere

return falseChecker(binList, r, c, size) 

o la funzione ricorsiva termina e la funzione esterna continua fino a si nce non è ancora tornato. Quindi termina senza restituire, quindi restituisce None.

2

Hai bisogno di un return alla fine del falseChecker:

def falseChecker(binList, r, c, size): 
    sCheck = isSpaceFree(binList, r, c, size) 
    if sCheck == True: 
     for x in range(c, c+size): 
      for y in range(r, r+size): 
       binList[x][y] = size 
     return binList 
    else: 
     c += 1 
     if c > len(binList): 
      c = 0 
      r += 1 
      if r > len(binList): 
       return binList 

     ################################# 
     return falseChecker(binList, r, c, size) 
     ################################# 

In Python, le funzioni restituiscono None per difetto se vengono alla fine di se stessi senza tornare. Inoltre, quando falseChecker viene eseguito per la prima volta, se sCheck è False, verrà eseguito il blocco else. Questo blocco di codice non contiene uno return. Per questo motivo, il valore di ritorno massimo di falseChecker sarà None.

Problemi correlati