11

基本的に次のような Python コードがあります。

my_start_list = ...

def process ( my_list ):
    #do some stuff
    
    if len(my_list) > 1:
        process(my_list)
    else:
        print(my_list)
        return my_list
   
print(process(my_start_list))

奇妙なことprint(my_list)に、正しい内容が出力されます。ただし、関数の戻り値を出力する 2 番目の print ステートメントは、常に を出力しNoneます。通常のreturnステートメントをreturn("abc")それに置き換えても、まだNoneです。

returnステートメントの1行前までは変数の内容が正しいように見えるので、どこからデバッグを開始すればよいかわかりません。これを引き起こす可能性のある一般的な問題はありますか?

4

4 に答える 4

17

何が起こっているかは次のとおりです。

  1. を呼び出しますprocess(my_start_list)
  2. 関数では、ifブロックは iflen(my_list) > 1で実行され、return ステートメントはありません。ここで、 はelse実行されておらず、return 節がある唯一の場所であるため、デフォルトの を返しますNone
  3. リストに 0 個または 1 個の要素がある場合は、そのリストを返します。

これを修正するには、 によって返されるリストを返す必要がありますprocess(my_list)

あれは:

def process(my_list):
    # do some stuff
    ...
    if len(my_list) > 1:
        return process(my_list)
    else:
        print(my_list)
        return my_list
于 2013-04-03T13:50:13.770 に答える
9

要素が 1 つまたは 0 の場合にのみリストを返します (基本ケース)。再帰呼び出しを行う最初のブロックにも return ステートメントが必要です。そうしないと、基本ケースにドリルダウンし、長さ 1 のリストを次のレベルに戻しNone、残りを上に戻します。したがって、代わりに次のようになります。

def process(my_list):
    # Do some stuff.
    if len(my_list) > 1:
        return process(my_list) #If you don't return this result, you return None
    else:
        print(my_list)
        return my_list

すべてのケース (基本ケースだけでなく) には戻り値があるため、戻り値は最初の呼び出しまで伝搬されます。

于 2013-04-03T13:42:29.783 に答える
2

他の人が指摘したように、あなたはreturn声明を欠いています。

個人的には、末尾の再帰を反復に変えます。

def process(my_list):
    while True:
        # do some stuff
        if len(my_list) <= 1:
            return my_list

これにより、意図が少し明確になり、末尾再帰に関連するいくつかの落とし穴も回避できると思います。

于 2013-04-03T13:58:35.467 に答える