在*args上循环重置conn

2024-09-28 17:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一些编造的代码,试图理解*args功能,但很难让我的counter变量不重置。你知道吗

在第4项之后,编号重置回0,但我希望它在参数之间继续。你知道吗

lst = ['apple', 'banana', 'orange', 'lemon']
lst2 = ['apple2', 'banana2', 'orange2', 'lemon2']
lst3 = ['apple3', 'banana3', 'orange3', 'lemon3']


def generateMenu(*args):
    counter = 0

    for i in args:
        def recurse(l, counter):
            for i in l:
                counter += 1
                if isinstance(i, (list, tuple)):
                    recurse(i, counter)
                else:
                    print("{}. {}.".format(counter, i))
        recurse(i, counter)


generateMenu(lst, lst2, lst3)

输出:

1. apple.
2. banana.
3. orange.
4. lemon.
1. apple2.
2. banana2.
3. orange2.
4. lemon2.
1. apple3.
2. banana3.
3. orange3.
4. lemon3.

Tags: applecounterargs重置lemonbananaorangelst
3条回答

Python对函数作用域之外的变量的写入有一些奇怪的规则。避免这种情况的最简单方法就是确保递归函数在每个状态返回计数器值。我稍微重构了一下,使它更清楚地显示出发生了什么。你知道吗

lst = [('apple', 'banana'), 'orange', 'lemon']
lst2 = ['apple2', 'banana2', 'orange2', 'lemon2']
lst3 = ['apple3', 'banana3', 'orange3', 'lemon3']


def generateMenu(*args):
    outer_counter = 1

    def recurse(l, inner_counter):
        for i in l:
            if isinstance(i, (list, tuple)):
                inner_counter = recurse(i, inner_counter)
            else:
                print("{}. {}.".format(inner_counter, i))
                inner_counter += 1
        return inner_counter

    for i in args:
        outer_counter = recurse(i, outer_counter)


generateMenu(lst, lst2, lst3)

问题是你的recurse函数不知道你的counter来自上限。所以在每个for i in l:循环中增加的只是“内部”counter变量。你知道吗

您的示例可能会让您感到困惑,因为您使用了两次相同的变量名(counteri)。尝试以不同的方式重命名它们,您可能会更好地了解代码发生了什么。你知道吗

您应该使counter成为nonlocal(在Python3中引入了非局部)

lst = ['apple', 'banana', 'orange', 'lemon']
lst2 = ['apple2', 'banana2', 'orange2', 'lemon2']
lst3 = ['apple3', 'banana3', 'orange3', 'lemon3']


def generateMenu(*args):
    counter = 0

    for i in args:
        def recurse(l):
            nonlocal counter
            for i in l:
                counter += 1
                if isinstance(i, (list, tuple)):
                    recurse(i)
                else:
                    print("{}. {}.".format(counter, i))
        recurse(i)


generateMenu(lst, lst2, lst3)

或者,从recurse返回counter

lst = ['apple', 'banana', 'orange', 'lemon']
lst2 = ['apple2', 'banana2', 'orange2', 'lemon2']
lst3 = ['apple3', 'banana3', 'orange3', 'lemon3']

def generateMenu(*args):
    counter = 0

    for i in args:
        def recurse(l, counter):
            for i in l:
                counter += 1
                if isinstance(i, (list, tuple)):
                    counter = recurse(i, counter)
                else:
                    print("{}. {}.".format(counter, i))
            return counter
        counter = recurse(i, counter)


generateMenu(lst, lst2, lst3)

相关问题 更多 >