当我运行这段代码时,它将循环超过3000次

时间:2016-03-10 22:50:55

标签: python

我只是试着跑去玩一些def来训练自己,意外 当我在这里和那里调用这个功能时,它会一遍又一遍地循环直到达到3000次 为什么要数3000次,然后停下来。

def print_two(*args):
    arg1, arg2 = args
    print "arg1: %r, arg2: %r" %(arg1, arg2)
    print_no_thing()


def print_no_thing():
    print ("No thing ")
    print_two_again("me and ", "you")

def print_two_again(arg1,arg2):
    print "arg1:%r, arg: %r" %(arg1,arg2)
    print_two("pack","packer")

print_two_again("cool", "cooler")

1 个答案:

答案 0 :(得分:2)

假设问题是你不想循环,你需要拥有所谓的terminal condition。目前:

  • print_two_again来电print_two
  • print_two来电print_no_thing
  • print_no_thing来电print_two_again

没有conditional clauses所以这些功能将继续相互呼叫,永不停止。你需要检测一些会导致它退出的东西。有两种方法可以做到这一点:

  • 不要让你的最后一个函数调用你的第一个函数。
  • 跟踪您循环并最终停止的次数。

第一个:

def print_two(*args):
    arg1, arg2 = args
    print "arg1: %r, arg2: %r" %(arg1, arg2)
    print_no_thing()


def print_no_thing():
    print ("No thing ")

def print_two_again(arg1,arg2):
    print "arg1:%r, arg: %r" %(arg1,arg2)
    print_two("pack","packer")

print_two_again("cool", "cooler")

第二个:

# Note that you shouldn't actually use global variables, but this is clear for demonstration purposes
max_loops = 100
current_loops = 0

def print_two(*args):
    arg1, arg2 = args
    print "arg1: %r, arg2: %r" %(arg1, arg2)
    print_no_thing()


def print_no_thing():
    print ("No thing ")
    if max_loops > current_loops:
        current_loops += 1
        print_two_again("me and ", "you")

def print_two_again(arg1,arg2):
    print "arg1:%r, arg: %r" %(arg1,arg2)
    print_two("pack","packer")

print_two_again("cool", "cooler")

它目前停在三千的原因是你正在达到Python的最大递归深度。每个函数都会创建一个新的堆栈框架,因为您永远不会从函数返回(只调用新函数),所以您只需要添加新的堆栈帧。最终你会用完(当你到达maximum recursion depth时)。有关详情,请参阅this

请注意,尽管可以使用最大递归深度,但不建议这样做。 3000远远超出了绝大多数用例所需的范围。