You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何以下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:43:14