在我的CSE课程学校,我正在研究一个可选项目,这是一个囚徒困境到Python的版本。这是我的代码。当我运行它时,它开始工作,然后一旦它命中if语句,它返回错误'TypeError: 'bool' object is not iterable
。我该如何解决这个问题?
import random
def ipd_start():
print("Welcome to Prisoner's Dilemma. \n If you don't know what Game Theory is, you're in the wrong place. \n \n Enter Collude to collude, or Betray to betray.")
round_one()
def round_one():
answer=(input("You and a buddy got caught commiting a crime. Do you keep quiet, or rat on your best friend? \n "))
a = ["Collude", "Betray"]
G = random.choice(a)
print("You chose " + answer + ", and your partner chose " + G + ". ")
if all(G == "Collude" and answer==("Collude")):
both_free()
if all(G == 'Collude' and answer==('Betray')):
you_free()
if all(G == 'Betray' and answer=='Betray'):
both_jail
if all(G == 'Betray' and answer=='Collude'):
you_jail
答案 0 :(得分:3)
all(iterable)
期望一个可迭代的参数。 PyDocs。但是你给了它一个布尔值。让我们分解第一个if
声明。
if all(G == "Collude" and answer==("Collude")):
因此,如果G == "Collude"
将返回布尔值以及answer == ("Collude")
。你AND
他们在一起产生另一个布尔值。所以最后你要传递一个布尔值,而不是所需的迭代值。
让您的if
语句看起来更像这样:
if G == "Collude" and answer==("Collude"):
答案 1 :(得分:1)
你的if语句使用all()函数。这需要一个可迭代的,而不是一个布尔语句。这就是错误的含义。
要修复,请尝试删除all()函数,并将其保留为完整的布尔语句;
if G == 'Betray' and answer == 'Collude':
you_jail()
答案 2 :(得分:0)
函数all
需要一系列布尔值并返回所有布尔值True
。你传递了一个布尔表达式,它产生了上面提到的错误。
我想你可以放弃all
的电话。
答案 3 :(得分:0)
问题在于all(G == "..." and answer == "...")
。选择G == "..." and answer == "..."
或all(G == "...", answer == "...")
,您无法同时执行这两项操作。你得到的确切错误是因为and
产生了一个布尔值,而all
需要一个列表或它可以迭代/循环的东西。