Python 初学者试图调试一个简单的程序
我是一名学生,刚刚开始学习代码。现在我正在使用Python,有一个我认为应该可以运行的程序,但只返回了一些我不理解的错误: 回溯(最近一次调用):文件“C:\Program” 文件\Notepad++\1913lab3.py”,第23行,打印(多数(奇数, [])) 文件“C:\Program Files\Notepad++\1913lab3.py”,第9行,多数情况下为N= S[i]UnboundLocalError:之前引用的局部变量“i” 分配 我不明白第一个错误告诉我什么,但我想我理解第二个错误,但我不明白为什么我会得到它。我不认为我是一个局部变量,因为我一开始就定义了它。代码如下:Python 初学者试图调试一个简单的程序,python,compiler-errors,Python,Compiler Errors,我是一名学生,刚刚开始学习代码。现在我正在使用Python,有一个我认为应该可以运行的程序,但只返回了一些我不理解的错误: 回溯(最近一次调用):文件“C:\Program” 文件\Notepad++\1913lab3.py”,第23行,打印(多数(奇数, [])) 文件“C:\Program Files\Notepad++\1913lab3.py”,第9行,多数情况下为N= S[i]UnboundLocalError:之前引用的局部变量“i” 分配 我不明白第一个错误告诉我什么,但我想我理解第
t = 0
f = 0
i = 0
def odd(N):
return N % 2 != 0
def most(P, S):
N = S[i]
if P == True:
t += 1
else:
f += 1
i += 1
if i < len(S):
most(P, S)
else:
if t > f:
return 'True'
else:
return 'False'
print(most(odd, []))
print(most(odd, [0]))
print(most(odd, [1]))
print(most(odd, [1, 2]))
print(most(odd, [1, 2, 3]))
t=0
f=0
i=0
def奇数(N):
返回N%2!=0
def most(P,S):
N=S[i]
如果P==真:
t+=1
其他:
f+=1
i+=1
如果我f:
返回“True”
其他:
返回“False”
打印(多数(奇数,[]))
打印(大多数(奇数,[0]))
打印(大多数(奇数[1]))
打印(大多数(单数[1,2]))
打印(大多数(单数[1,2,3]))
赋值是定义递归函数(most())。该函数将一个函数和一个列表作为其参数(P和S)。我不能使用循环或局部变量。以下是作业中的一句话:
“p是一个参数的函数,返回True或False,
S是一个列表。函数在S的每个元素上调用P的次数最多
如果P返回True的频率比返回False的频率高,则必须返回True。
否则它必须返回False。”
这5个打印命令只是5个例子,我需要为学分工作,但这个程序需要为所有列表工作。如果有人能帮我纠正这些错误,那就太好了。(此外,欢迎使用任何常规Python提示。)默认情况下,函数中修改的任何变量都假定为该函数的局部变量。因此,如果您有
i+=1
,则必须首先在函数中定义i
。或者您必须将i
声明为全局第一(global i
),以便python知道它引用的是您在函数外部定义的i
。但是要注意全局变量,它们通常是危险的(因为它们使跟踪正在发生的事情变得困难),如果可能的话应该避免使用。默认情况下,在函数中修改的任何变量都被认为是该函数的局部变量。因此,如果您有i+=1
,则必须首先在函数中定义i
。或者您必须将i
声明为全局第一(global i
),以便python知道它引用的是您在函数外部定义的i
。但是要小心环球旅行,他们通常是危险的(因为他们很难跟踪正在发生的事情),如果可能的话应该避免。看看这个答案:看看这个问题:()。您的问题是,您试图修改函数中的全局变量,但由于python不要求您在使用变量之前声明变量,因此python无法知道您在函数中使用的变量是否应解释为创建仅存在于函数中的新变量,或者,如果您是指具有该名称的全局变量。@amorpheus,但他全局定义了i
,这可能使他相信他使用的是“全局”i
变量。另外,你的评论有点粗鲁……看看这个答案:看看这个问题:()。您的问题是,您试图修改函数中的全局变量,但由于python不要求您在使用变量之前声明变量,因此python无法知道您在函数中使用的变量是否应解释为创建仅存在于函数中的新变量,或者,如果您是指具有该名称的全局变量。@amorpheus,但他全局定义了i
,这可能使他相信他使用的是“全局”i
变量。另外,你的评论有点粗鲁……谢谢你的快速回复!因此,似乎我可以解决这个问题,但在我的函数顶部插入“全局I”,但这样做是不受欢迎的,可能会有问题。那么,我怎样才能使用全局命令呢?lab赋值只允许我对函数most使用两个输入,P和S。例如,您可以定义一个helper递归函数,该函数返回True和False之间的差值。然后检查一下这个差异的迹象。谢谢你的快速回复!因此,似乎我可以解决这个问题,但在我的函数顶部插入“全局I”,但这样做是不受欢迎的,可能会有问题。那么,我怎样才能使用全局命令呢?lab赋值只允许我对函数most使用两个输入,P和S。例如,您可以定义一个helper递归函数,该函数返回True和False之间的差值。然后检查一下这个差异的符号。