python递归函数错误使用方式

枫铃3年前 (2021-09-30)Python240

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的垃圾回收机制导致的内存释放问题,递归下面不要出现调用递归之上的变量的代码,否则你永远拿不到正确的结果)

下面是更改之后的代码:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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.错误二:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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上面就能解除.

相关文章

7道Python函数相关的练习题

1.写函数,接收一个参数...

python常用的日期时间模块

今天、昨天、明天 im...

python 单例模式

1、什么是单例模式 单...

Python创建一个循环链表、双向循环链表

Python创建一个循环链表、双向循环链表

循环链表与双向循环链表...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。