Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在*args上循环重置计数器_Python_Python 3.x - Fatal编程技术网

Python 在*args上循环重置计数器

Python 在*args上循环重置计数器,python,python-3.x,Python,Python 3.x,我正在编写一些编造的代码,试图理解*args功能,但很难让我的计数器变量不复位 在第4项之后,编号重置回0,但我希望它在参数中继续 lst = ['apple', 'banana', 'orange', 'lemon'] lst2 = ['apple2', 'banana2', 'orange2', 'lemon2'] lst3 = ['apple3', 'banana3', 'orange3', 'lemon3'] def generateMenu(*args): counter

我正在编写一些编造的代码,试图理解
*args
功能,但很难让我的
计数器
变量不复位

在第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.

问题是您的
递归
函数不知道您的
计数器
来自上限。因此,对于l:循环中的i,在每个
中增加的只是“内部”
计数器
变量


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

问题是您的
递归
函数不知道您的
计数器
。因此,对于l:
循环中的i,在每个
中增加的只是“内部”
计数器
变量


您的示例可能会让您感到困惑,因为您两次使用相同的变量名(
counter
i
)。尝试以不同的方式重命名它们,您可能会更好地了解代码的情况。

您应该将
计数器设置为
非本地的
(非本地是在Python3中引入的)

或者,从
recurse

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)

您应该使
计数器
成为
非本地
(非本地是在Python3中引入的)

或者,从
recurse

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)

Python在函数作用域外的变量写入方面有一些奇怪的规则。避免这种IMO的最简单方法就是确保递归函数在每个状态返回计数器值。我稍微进行了重构,以使它更清楚地了解正在发生的事情

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)

Python在函数作用域外的变量写入方面有一些奇怪的规则。避免这种IMO的最简单方法就是确保递归函数在每个状态返回计数器值。我稍微进行了重构,以使它更清楚地了解正在发生的事情

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)

你永远不会给第二个参数来递归。不过我认为这是个错误。此外,跟踪计数器变量的事实可能会导致关闭行为。使参数和变量的名称不同。使用全局计数器怎么样?首先定义函数的外部
计数器=0
,然后将函数的第一行替换为
全局计数器
@Carcigenicate。他在对
递归
的外部调用中传递
计数器
,而不是在内部调用中。而内部大小写恰好从未被给定的输入触发。@deceze Right,我忘记了它是被解释的,因此错误不会立即显示。我删除了我的答案,因为我很少编写Python,并且完全忘记了
global
是必要的。我想其他人会给你一个比我更权威的答案。这几乎肯定是因为你用参数来隐藏你的变量,你永远不会给第二个参数递归。不过我认为这是个错误。此外,跟踪计数器变量的事实可能会导致关闭行为。使参数和变量的名称不同。使用全局计数器怎么样?首先定义函数的外部
计数器=0
,然后将函数的第一行替换为
全局计数器
@Carcigenicate。他在对
递归
的外部调用中传递
计数器
,而不是在内部调用中。而内部大小写恰好从未被给定的输入触发。@deceze Right,我忘记了它是被解释的,因此错误不会立即显示。我删除了我的答案,因为我很少编写Python,并且完全忘记了
global
是必要的。我想其他人会给你一个比我更权威的答案。这几乎肯定是由于你用参数来隐藏你的变量。我怎样才能
将它返回到外部范围而不中断循环?它要么定义
全局/非局部
,要么将外部
计数器
传递给
递归
函数,并将它添加到每个循环中的内部计数器,或者分配一个函数调用变量并返回,就像John La Rooy的例子一样。我如何
在不中断循环的情况下将其返回到外部范围?它要么定义
全局/非局部
,要么将外部
计数器
传递给
递归
函数,并将其添加到每个循环中的内部计数器,要么将函数分配给变量并返回,就像约翰·拉鲁伊的例子,完美。两个都试过了,没有问题。非常感谢你!完美的两个都试过了,没有问题。非常感谢你!