【问题标题】:Recursion and Scope - Assigning a variable conditionally - No Mutable Object Passing递归和范围 - 有条件地分配变量 - 没有可变对象传递
【发布时间】:2026-01-27 03:30:01
【问题描述】:

我对以下函数有一个变体:

from random import randint

def assign_a_value_conditionally():

    threshold = randint(1,4)

    if threshold > 3:

        value = "We made it!"
        return value

    print('before recursion')
    assign_a_value_conditionally()
    print('after recursion')

a = assign_a_value_conditionally()

如果函数递归,a = None

如果函数不递归,a = "We made it!"

我预计a 在这两种情况下都等于"We made it!",因为它会随分配返回。

我可以看到发生了什么,但有人可以解释为什么会发生这种情况,并推荐一种设计模式以获得预期的结果吗?

Here's a ready to run version

我查看了一堆已经问过的递归问题,我看到的是关于可变对象的问题,所以如果在某处重复,我深表歉意。我也不知道怎么称呼它。

如果我尝试回答,那是因为值返回到函数返回的嵌套中,而不是 print 语句所示的外部函数范围。

但我可以使用更多的解释/讨论。

谢谢。

【问题讨论】:

    标签: python recursion scope


    【解决方案1】:

    return递归调用的结果:

    print('before recursion')
    # without return, this statement is without effect
    return assign_a_value_conditionally()    
    # print('after recursion')  won't be reached
    

    如果需要对递归结果进行处理,必须先存储结果:

    res = assign_a_value_conditionally()    
    # ... process res
    return res
    

    【讨论】:

    • 最后一个print 永远不会被执行。
    • @avysk 是的,很明显 :) 该睡觉了
    • 所以你破坏了预期的行为,我想。应该是res = assign_a_value_conditionally(),然后是print ...,然后是return res
    • @avysk print 语句在我看来很像纯粹的调试。尽管如此,问题仍然很明显,OP可以进行调整。
    • 它们是,但我想从这个问题来看,它们对于主题启动者了解正在发生的事情很有用:)