Python NameError:未定义外部变量
在Python NameError:未定义外部变量,python,function,Python,Function,在可能的结果()中调用Score()的正确方法是什么 我不断得到以下错误: A_win = A_score+(K*(1-win_probability_A)) NameError: name 'A_score' is not defined 我花了一些时间研究建议的答案,但未能成功实施解决方案。更具体地说,我不明白如何在另一个函数中使用一个函数的多个返回值。多谢各位 def Score(): A_score= 1500 B_score= 1600 win_probabi
可能的结果()中调用Score()
的正确方法是什么
我不断得到以下错误:
A_win = A_score+(K*(1-win_probability_A))
NameError: name 'A_score' is not defined
我花了一些时间研究建议的答案,但未能成功实施解决方案。更具体地说,我不明白如何在另一个函数中使用一个函数的多个返回值。多谢各位
def Score():
A_score= 1500
B_score= 1600
win_probability_A= 1/(1+10**((B_score-A_score)/400))
win_probability_B= 1/(1+10**((A_score-B_score)/400))
return A_score, B_score, win_probability_A, win_probability_B
y=Score()
def Possible_Outcomes(y):
K=int(32)
A_win = A_score+(K*(1-win_probability_A))
A_loss = A_score+(K*(0-win_probability_A))
B_loss = B_score+(K*(0-win_probability_B))
B_win= B_score+(K*(1-win_probability_B))
return
Possible_Outcomes(y)
你所拥有的是一个范围问题。您确实定义了A_score
,但仅在函数score()
的上下文中定义。在这个范围之外,Python不知道在哪里查找A_score
,或者您在那里定义的任何其他变量
我已经改写了您的代码,我相信这是您打算做的:
def Score():
A_score = 1500
B_score = 1600
win_probability_A = 1/(1+10**((B_score-A_score)/400))
win_probability_B = 1/(1+10**((A_score-B_score)/400))
return A_score, B_score, win_probability_A, win_probability_B
y = Score()
def Possible_Outcomes(values):
A_score, B_score, win_probability_A, win_probability_B = values
K = int(32)
A_win = A_score+(K*(1-win_probability_A))
A_loss = A_score+(K*(0-win_probability_A))
B_loss = B_score+(K*(0-win_probability_B))
B_win= B_score+(K*(1-win_probability_B))
return A_win, A_loss, B_loss, B_win
Possible_Outcomes(y)
你所拥有的是一个范围问题。您确实定义了A_score
,但仅在函数score()
的上下文中定义。在这个范围之外,Python不知道在哪里查找A_score
,或者您在那里定义的任何其他变量
我已经改写了您的代码,我相信这是您打算做的:
def Score():
A_score = 1500
B_score = 1600
win_probability_A = 1/(1+10**((B_score-A_score)/400))
win_probability_B = 1/(1+10**((A_score-B_score)/400))
return A_score, B_score, win_probability_A, win_probability_B
y = Score()
def Possible_Outcomes(values):
A_score, B_score, win_probability_A, win_probability_B = values
K = int(32)
A_win = A_score+(K*(1-win_probability_A))
A_loss = A_score+(K*(0-win_probability_A))
B_loss = B_score+(K*(0-win_probability_B))
B_win= B_score+(K*(1-win_probability_B))
return A_win, A_loss, B_loss, B_win
Possible_Outcomes(y)
您可以添加一行来获取scope()
函数返回的值
A_score, B_score, win_probability_A, win_probability_B=y
此外,还可以在第二个函数中调用该函数以提高可读性
def Possible_Outcomes():
K=int(32) # not sure what you are trying to do here can be just K=32
A_score, B_score, win_probability_A, win_probability_B = Score() # fetch all the values returned by the function
A_win = A_score+(K*(1-win_probability_A))
A_loss = A_score+(K*(0-win_probability_A))
B_loss = B_score+(K*(0-win_probability_B))
B_win= B_score+(K*(1-win_probability_B))
#return # you do not need to return in every function
Possible_Outcomes()
其他方法可能包括使用全局变量,我不建议使用全局变量,除非保留唯一选项您可以添加一行以获取scope()
函数返回的值
A_score, B_score, win_probability_A, win_probability_B=y
此外,还可以在第二个函数中调用该函数以提高可读性
def Possible_Outcomes():
K=int(32) # not sure what you are trying to do here can be just K=32
A_score, B_score, win_probability_A, win_probability_B = Score() # fetch all the values returned by the function
A_win = A_score+(K*(1-win_probability_A))
A_loss = A_score+(K*(0-win_probability_A))
B_loss = B_score+(K*(0-win_probability_B))
B_win= B_score+(K*(1-win_probability_B))
#return # you do not need to return in every function
Possible_Outcomes()
其他方法可能包括使用全局变量,我不建议使用全局变量,除非留下唯一选项win\u probability\u A(或内部可能结果的等效值)是y[2]
(由分数返回)。顺便说一句:命名真的很糟糕。K=int(32)
在做什么?谢谢克里斯蒂。可能的结果(y[2])给了我一个语法错误,所以我误解了你的评论。我们如何在可能的结果中使用Score()中定义的所有变量()?嗨,奥斯汀,K系数只是比赛中可以交换的最大点数。获胜概率(或可能结果中的等效值)是y[2]
(由Score返回)。顺便说一句:命名真的很糟糕。K=int(32)在做什么?谢谢克里斯蒂。可能的结果(y[2])给了我一个语法错误,所以我误解了你的评论。我们如何在可能的结果()中使用Score()中定义的所有变量?嗨,Austin,K因子只是比赛中可以交换的最大点数。谢谢,它确实有效。我想这里的要点是,无论何时在函数中使用非局部变量,都必须在该函数的开头声明它们。这是否意味着Score()中的return语句是不必要的?这并不是重点。实际上,我们不需要在可能的结果()函数中定义分数,我这样做是为了与代码保持一致。例如,在Possibe_outcouts()
中,您可以用值[0]
替换A_分数的所有实例。这里的要点应该是,仅仅因为变量是在代码中的某个地方定义的,并不意味着它无处不在。只是对作用域要更加小心。我知道变量是局部的,但我的理解是,如果一个函数定义了一个变量,然后在另一个函数中调用该函数,那么第一个函数中的所有变量都将被传递到第二个函数。谢谢,它确实有效。我想这里的要点是,无论何时在函数中使用非局部变量,都必须在该函数的开头声明它们。这是否意味着Score()中的return语句是不必要的?这并不是重点。实际上,我们不需要在可能的结果()函数中定义分数,我这样做是为了与代码保持一致。例如,在Possibe_outcouts()
中,您可以用值[0]
替换A_分数的所有实例。这里的要点应该是,仅仅因为变量是在代码中的某个地方定义的,并不意味着它无处不在。只是要更加注意范围。我理解变量是局部的,但我的理解是,如果一个函数定义了一个变量,然后在另一个函数中调用该函数,那么第一个函数中的所有变量都将被传递到第二个函数。谢谢。我只是想了解函数是如何从其他函数接收变量的,特别是当需要接收多个变量时。因此,这里的想法是,在正确使用可能的结果()之前,在其中声明Score()变量?当您返回多个对象时,它将作为一个类似元组的iterable返回。您可以通过打印元素print(Score())来尝试调试
它将返回一个元组,该元组的值与一个固定的索引绑定,您可以访问该索引,如[0]
,它将给出的值和分数
,现在我们可以解包iterable并以我们想要的方式存储它。因此,A_score
是第一个iterable的值,依此类推。这正是蟒蛇式的方法。试着用谷歌搜索一下pythonThank中的解包,谢谢你的推荐。我只是想了解函数是如何从其他函数接收变量的,特别是当需要接收多个变量时。因此,这里的想法是,在正确使用可能的结果()之前,在其中声明Score()变量?当您返回多个对象时,它将作为一个类似元组的iterable返回。您可以通过打印元素print(Score())来尝试调试
它将返回一个元组,该元组的值与一个固定索引绑定,您可以访问该索引,如[0]
,该索引将给出