【问题标题】:Python recursion returning old valuePython递归返回旧值
【发布时间】:2015-06-30 18:59:01
【问题描述】:

我正在尝试在 Python 2 中创建一个简单的控件,以确保用户的输入小于给定的常量。如果不是这种情况,它应该再次要求另一个整数,直到它更小。

limit_store = 12

def input_store():
    sel_store = int(raw_input("Which store do you want? "))
    if sel_store > limit_store:
        print "Store number %i is not valid" % sel_store
        input_store()  
    return sel_store

store = input_store()

这是我第一次在 Ipython 笔记本上写它的时候。现在,如果第一个输入是 9,它会按预期返回 9。如果输入是大于 12 的 999,则运行 if 语句,我们可以选择另一个整数。在错误的输入之后选择正确的输入将返回旧的错误输入而不是新的输入。

【问题讨论】:

  • 您需要return input_store()sel_store 的值将在第一次调用该函数时存储,因此如果您输入 100 个不同的数字,您将始终获得第一个,除非您返回跨度>

标签: python recursion return


【解决方案1】:

您需要在打印“无效”消息后保存该值。

if sel_store > limit_store:
    print "Store number %i is not valid" % sel_store
    sel_store = input_store() # save value here

returning 号码而不是保存它也可以工作 - 只要号码放在有用的地方而不是被丢弃。 Python doesn't have TCO,因此性能优势很小。不同之处在于您认为更可取的是:您的函数有一个 return 语句,或者它立即 returns 而不是首先保存变量。

反正循环会更简单:

def input_store():
    while True:
        sel_store = int(raw_input("Which store do you want? "))
        if sel_store <= limit_store: break
        print "Store number %i is not valid" % sel_store
    return sel_store

【讨论】:

  • 或者只是return input_store()
  • 很抱歉。我忘记在帖子中包含那篇文章。我现在正在编辑。
  • 否 - 在函数内打印“无效”消息后立即。
  • 我认为它有效。我仍然不确定为什么我的版本不起作用,但我理解你的原因。谢谢。
  • 这是因为你保存了最初的尝试,但是递归调用的返回值没有保存,所以实际上你有一行只是一个包含一些数字的语句,解释器立即扔掉了。