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的例子一样。我如何在不中断循环的情况下将其返回到外部范围?它要么定义全局/非局部,要么将外部计数器
传递给递归
函数,并将其添加到每个循环中的内部计数器,要么将函数分配给变量并返回,就像约翰·拉鲁伊的例子,完美。两个都试过了,没有问题。非常感谢你!完美的两个都试过了,没有问题。非常感谢你!