【问题标题】:Could someone please explain what happens in this python code?有人可以解释一下这个python代码发生了什么吗?
【发布时间】:2016-11-06 19:24:49
【问题描述】:

我是编程领域的新手。我很难理解这段代码的本质。

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. 如您所见,end() 函数在 question() 函数中被调用。假设我继续玩游戏。以前的调用者会发生什么,尤其是第一个问题()?它还开着吗?还是在调用 end() 函数后关闭。
  2. 只要我继续玩游戏,那会建立记忆吗?我知道一旦函数结束,内存就会被清除,但在这段代码中,它只是不断调用一个函数。只有关闭程序才能结束。

谢谢。

【问题讨论】:

  • 这是一种递归,但由于您不是在使用汇编或 C 编程,因此您不必担心,python 本身会以适当的方式处理内存和开销,除非您在循环中执行此操作很多次

标签: python python-3.x


【解决方案1】:
  1. 之前的调用者会发生什么,尤其是第一个问题()?还开着吗?

question() 函数仍然“打开”,或者至少仍在运行,其所有变量和其他资源都在使用中。

这叫做“递归”,非常值得你学习。函数question()被调用,它调用end(),如果玩家选择继续,这再次调用question(),它调用end()等等。你得到一堆函数,在question()和@987654328之间交替@,所有这些仍然存在并占用资源。如果游戏持续时间过长,所有可用资源都将被消耗,程序以stack overflow 错误结束——适合本网站!

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

  1. 只要我继续玩游戏,这会建立记忆吗?是的,这会在计算机内存中建立项目 - 至少在计算机环境无法识别尾递归的情况下。

【讨论】:

  • 是的,CPython 没有优化尾递归,请参阅 here
  • 哇,这很简短,但信息量很大。谢谢罗里先生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
相关资源
最近更新 更多