有人可以解释一下这个python代码中会发生什么吗?

时间:2016-11-06 11:17:02

标签: python python-3.x

我是编程场景的新手。我很难掌握这段代码的本质。

import time
from random import randint

replies =["Yes","No","Possibly", "Ask again later", "IDK"]

def question():
    print "What is your question?"
    question = raw_input()
    print "Thinking"
    time.sleep(3)
    print replies[randint(0,4)]
    end()

def end():
    print "Thanks for playing! Do you want to try again?"
    user_reply = raw_input()
    if user_reply == "yes":
        question()


print "Welcome to the magic 8-ball"
question()

我的问题是:

  1. 正如您所看到的,在question()函数中调用了end()函数。并且假设我继续玩游戏。前一个调用者会发生什么,特别是第一个问题()?它仍然开放吗?或者一旦调用end()函数就关闭。
  2. 只要我继续玩游戏,这会积累回忆吗?我知道一旦函数结束就会清除记忆,但是在这段代码中它只是一直调用一个函数。它结束的唯一时间是你关闭程序。
  3. 谢谢。

1 个答案:

答案 0 :(得分:2)

  1. 以前的来电者会发生什么,尤其是第一个问题()?它仍然是开放的吗?
  2. question()功能仍在"打开"或至少仍在运行,其所有变量和其他资源都在使用。

    这称为"递归"并且非常值得你学习。调用函数question(),调用end(),如果玩家选择继续,则会再次调用调用question()等的end()。您将获得一堆函数,在question()end()之间交替,所有这些仍然存在并占用资源。如果游戏持续时间过长,将消耗所有可用资源,并且程序以stack overflow错误结束 - 适用于此站点!

    每个调用都发生在调用例程的末尾,这种情况称为"尾递归。"一些计算机语言的编译器可以识别这个并用循环替换递归,因此调用例程确实在新例程开始之前关闭。我不相信标准的Python解释器会这样做,因此例程将在计算机堆栈上构建。

    1. 只要我继续玩游戏,这会积累回忆吗?是的,这会在计算机内存中构建项目 - 至少在计算机环境无法识别尾递归时。 / LI>