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]
,该索引将给出