首页 > 编程语言 > 详细

58.python递归函数错误使用方式

时间:2020-06-18 10:01:39      阅读:50      评论:0      收藏:0      [点我收藏+]

1.python递归函数入坑:

ip_list = []
def chooseDebugLinux():
    import random
    info = {}
    dockerip = random.randint(1, 3)

    global ip_list
    if dockerip not in ip_list:
        print(dockerip, ‘*‘ * 50)
        ip_list.append(dockerip)
    else:
        chooseDebugLinux()

    print("dockerip列表:", ip_list)

    info[‘dockerip‘] = dockerip
    # info[‘dockerip‘] = "10.20.84.201"
    info[‘dockername‘] = ‘docker--%s--%s‘ % ("11111111111", info[‘dockerip‘])
    print(info[‘dockername‘], ‘*‘ * 50)
    return info, info[‘dockername‘]


if __name__ == ‘__main__‘:

    import threading
    for i in range(10):
        threading.Thread(target=chooseDebugLinux).start()

问题产生:一段时间内并发10个请求,我的ip是一个范围内的,所以当有人使用了我就不能让其他人使用,这个时候我用到了递归函数.
    大致如上,在进行递归的过程中,我在递归下面写了部分代码.但是令我们想不到的错误发生了,他虽然产生了递归,但是当递归结束他还会回到上一次产生递归的条件,也就是将函数内的变量回滚到上一次的递归中,直到递归第一次产生的地方(变量也回滚了),这个时候,才会执行递归下面的代码但是我需要的而变量是递归之后产生的变量,而现在却因为递归的回滚操作,是的变量回滚到最初的时候.这个时候的变量不是我需要的,所以程序一直报错.(所以我认为这是python的垃圾回收机制导致的内存释放问题,递归下面不要出现调用递归之上的变量的代码,否则你永远拿不到正确的结果)
    
下面是更改之后的代码:
ip_list = []
def chooseDebugLinux():
    import random
    info = {}
    dockerip = random.randint(1, 3)

    global ip_list
    if dockerip not in ip_list:
        print(dockerip, ‘*‘ * 50)
        ip_list.append(dockerip)
    else:
        chooseDebugLinux()
        info[‘dockerip‘] = dockerip
        # info[‘dockerip‘] = "10.20.84.201"
        info[‘dockername‘] = ‘docker--%s--%s‘ % ("11111111111", info[‘dockerip‘])
        print(info[‘dockername‘], ‘*‘ * 50)
        print("dockerip列表:", ip_list)
    return info, info[‘dockername‘]


if __name__ == ‘__main__‘:

    import threading
    for i in range(10):
        threading.Thread(target=chooseDebugLinux).start()

58.python递归函数错误使用方式

原文:https://www.cnblogs.com/liuzhanghao/p/13155795.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!