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

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.2xxxxxx1"
    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)
        info['dockerip'] = dockerip
        info['dockername'] = 'docker--%s--%s' % ("11111111111", info['dockerip'])
    else:
        chooseDebugLinux()
    return info, info['dockername']


if __name__ == '__main__':

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

2.错误二:

def check_file_exists(planName):
    """检查脚本文件是否存在"""
    jmeter_xml_root = os.path.join(settings.BASE_DIR, "xxxxx")
    ret = os.path.exists(jmeter_xml_root)
    num = 3
    if not ret and num > 0:
        num -= 1
        time.sleep(1)
        check_file_exists(planName)
    return ret

这次又写了一个bug,这个函数是一个死循环,递归进去之后每次都将num重新改为3,根本出不来.

3.错误三:

def connection():
    print("进入函数")
    flag = False
    count = 3
    while not flag and count > 0:
        try:
            # 由于这里莫名其妙到第四个docker链接之后一直报错,所以在这里尝试连接三次
            1/0
            count -= 1
            flag = True
        except Exception as e:
            print("发生错误,进入循环")
            pass
这次又是个bug还好我检查了,因为我将count-=1卸载D.SFTPConnect()下面,如果连接错误它永远
也不会减一,导致循环我先进行.所以这次有给我提了个醒,关于递归和while这种容易出现死循环的
代码必须进行测试才可以使用.其实只需要将count-=1移动到 1/0 上面就能解除.
原文地址:https://www.cnblogs.com/liuzhanghao/p/13155795.html