Return 负值

Return a negative value

我正在尝试实现一个函数,我有 2 个玩家,他们的收益取决于他们的行为。

def game(action1,action2):

  if action1 == "a" and action2 == "a":
     payoff1 = 1
     payoff2 = 1
  elif action1 == "a" and action2 == "b":
     payoff1 = -5
     payoff2 = 3
  elif action1 == "b" and action2 == "a":
     payoff1 = 3
     payoff2 = -5
  elif action1 == "b" and action2 == "b":
     payoff1 = 2
     payoff2 = 2
 return payoff1 , payoff2

那么我对这个游戏的攻略(例子):

def TitForTat(round_num, previous_action):
    if round_num == 0:
       action = "a"
    else:
       action = previous_action
  return action

def AlwaysDefect():
  return "b"

action1 = TitForTat (0,'c')
action2 = AlwaysDefect()

game (action1,action2)

这returns一个错误:

local variable 'payoff1' referenced before assignment

我试着将它们初始化为 "0" ,但还是一样。 如果我有所有正值,那么确切的功能非常有效。

编辑:

很抱歉打字错误。和函数 AlwaysDefect() returns "b" 和 "d"。

如果动作是 c 或 d,则您的 if 语句无法捕捉,这会导致 payoff1 和 payoff2 未被初始化。

您的意思是 AlwaysDefect 函数 return 'd' 或 'b'?

现在它 return 'd',你不会进入你的 if 语句的 none 并且你没有 payoff1 或 payoff2 的定义

还有一个错字:payyoff2 -> payoff2

您可以设置一个默认语句来修复它(在 else 部分):

def game(action1,action2):

  if action1 == "a" and action2 == "a":
     payoff1 = 1
     payoff2 = 1
  elif action1 == "a" and action2 == "b":
     payoff1 = -5
     payoff2 = 3
  elif action1 == "b" and action2 == "a":
     payoff1 = 3
     payoff2 = -5
  elif action1 == "b" and action2 == "b":
     payoff1 = 2
     payoff2 = 2
  else:
     payoff1 = 0 # or any other value
     payoff2 = 0 # or any other value
  return payoff1, payoff2

你的函数调用中有太多废话。使用字典:

def game(action1, action2):
    payoffs = {
        ('a', 'a'): (1, 1),  ('a', 'b'): (-5, 3),
        ('b', 'a'): (3, -5), ('b', 'b'): (2, 2)
    }
    return payoffs.get((action1, action2), (0, 0))

您应该将两种收益都初始化为某种东西,因为如果您的行为不属于特定情况,那么您最终 return 什么都不会。所以添加一个默认的 else 以便你的函数 return 默认收益下面的代码应该可以帮助你解决你的问题。

def game(action1,action2):


    if action1 == "a" and action2 == "a":
        payoff1 = 1
        payoff2 = 1
    elif action1 == "a" and action2 == "b":
        payoff1 = -5
        payoff2 = 3
    elif action1 == "b" and action2 == "a":
        payoff1 = 3
        payoff2 = -5
    elif action1 == "b" and action2 == "b":
        payoff1 = 2
        payoff2 = 2
    else:
        payoff1= 0
        payoff2=0


    return payoff1 , payoff2

从技术上讲,这应该可以防止您出现该引用错误。

这段代码有一些问题。

def game(action1,action2):
  # 1. this if/else chain only handles input values of "a" or "b"
  if action1 == "a" and action2 == "a":
     payoff1 = 1
     payoff2 = 1
  elif action1 == "a" and action2 == "b":
     payoff1 = -5
     payoff2 = 3
  elif action1 == "b" and action2 == "a":
     payoff1 = 3
     payoff2 = -5
  elif action1 == "b" and action2 == "b":
     payoff1 = 2
     # 2. this is misspelt, so payoff2 never gets declared for input "b","b"
     payyoff2 = 2

 return payoff1 , payoff2
  1. game的代码适用于("a","b")x("a","b")中的输入,但没有错误检查,事实上您发布的代码 确实 提供超出该范围的输入
  2. 其中一个有效输入 ("b","b") 仍然会失败,因为您拼错了 "payoff"。较不冗长的代码出现拼写错误的机会较少,但实际上这是您应该在测试中发现的东西。

    action1 = TitForTat (0,'c') action2 = AlwaysDefect()

为什么不在将参数传递给函数之前 打印 参数?或者打印函数内的参数?或者进入pdb里面的函数看一下?

您在此处将它们设置为 "a", "d"TitForTat 可以 生成 "c""c""d" 都没有在您的 game 函数中处理。