为何以下Python代码中return语句返回None类型?
为什么这段Python代码的return语句返回None?
有人能帮忙解释为何以下Python代码中的return语句会返回None类型吗?
N=4 board=[str(j) for i in range(N) for j in range(N)] def print_board(board): for i in range(N): print('|'+'|'.join(board[i*N:i*N+N])+'|') def print_rows(rows): for i in range(N): print('|'+'|'.join(rows[i])+'|') rows=[board[i*N:i*N+N] for i in range(N)] def attack(queen,location,array): #check rows for i in range(N): if array[i].count(queen)>1: return True #check columns column=[] columns=[] for i in range(N): for j in range(N): column.append(rows[j][i]) columns.append(column) column=[] for column in columns: if column.count(queen)>1: return True #diagonalupper diagonals=[] i=location[0] j=location[1] diagonal=[] while i>=0 and j>=0: diagonal.append(array[i][j]) i=i-1 j=j-1 diagonals.append(diagonal) diagonal=[] i=location[0] j=location[1] while i<N and j>=0: diagonal.append(array[i][j]) i=i+1 j=j-1 diagonals.append(diagonal) for diagonal in diagonals: if diagonal.count(queen)>1: return True def insert_letter(queen,array,start,startofline=0): for i in range(startofline,N,1): location=[start,i] array[location[0]][location[1]] = queen if attack(queen,location,array): array[location[0]][location[1]]='' def countqueen(queen,array): total_count=0 for row in array: total_count=total_count+row.count(queen) return total_count def backtrack(array,start,queen): start = start - 1 startofline = array[start].index(queen) + 1 for i in range(N): array[start][i]='' if startofline<N: play(array,queen,start,startofline) elif startofline>=N: backtrack(array,start,queen) solutions=[] def play(array,queen,start=0,startofline=0): if countqueen(queen,array)==N: print(queen) print(array) return array else: insert_letter(queen,array,start,startofline) if array[start].count(queen)==1: start+=1 startofline=0 else: backtrack(array,start,queen) play(array,queen,start,startofline) x=play(rows,'Q',0,0) print(x) print_rows(rows)
问题原因
核心问题出在play函数的递归逻辑上:
- 当满足
countqueen(queen,array)==N时,函数确实会return array,但这只是当前递归层级的返回值。 - 在
else分支处理完插入或回溯逻辑后,函数调用了play(array,queen,start,startofline),但没有将这个递归调用的结果返回。 - Python中,函数如果没有显式的return语句,默认会返回
None。你的play函数只有在if分支有return,其他路径都没有传递递归结果,最终顶层调用play(rows,'Q',0,0)自然返回None。
另外,代码会直接修改传入的原始array,但这和return None的问题无关,只是代码的副作用而已。
内容的提问来源于stack exchange,提问作者saber zaben
相关产品推荐
相关产品推荐

