每次下面的代码运行时,它会直接进入第一个else语句,然后运行下一个else语句四次。发生了什么以及如何修复它以便调用movement()模块?
class square(object):
def __init__(self,updown,leftright,residence,name):
self.updown = updown
self.leftright = leftright
self.residence = bool
self.name = name
a1 = square(1,1,True,"a1")
a2 = square(2,1,False,"a2")
b1 = square(1,2,False,"b1")
b2 = square(2,2,False,"b2")
square_dict = {a1:"a1",a2:"a2",b1:"b1",b2:"b2"}
movement_select()
def movement_select():
response = raw_input("where would you like to move?")
if response in square_dict:
moveTo = square_dict[response]
else:
print "this runs once"
for a in square_dict:
if a.residence == True:
moveFrom = a
movement(moveFrom,moveTo)
else:
print "this runs four times"
movement_select()
答案 0 :(得分:3)
了解您如何定义residence
:
self.residence = bool
因此,对于任何方格a
,a.residence
将是bool
类型,而不是布尔值True
(或其他任何内容)。所以这个测试总是会失败:
if a.residence == True:
要解决此问题,请将第一行更改为:
self.residence = residence
虽然我们处于此状态,但您很少需要== True
,因此您也可以将第二行更改为:
if a.residence:
但这不是必要的修复,只是一种简化代码的方法。
同时,你的squares_dict
有点奇怪。我不确定它是否不正确,但让我们来看看:
它从square
个对象映射到它们的名称。这可能是一件有用的事情。这意味着您可以迭代dict并获取所有square
s - 正如您在代码中正确执行的那样。如果您以后有square
想要得到它的名字,那么您可以使用square_dict
。再说一次,你可能只用一个square_list
获得同样的好处,并使用已经可用的名称作为square
对象的属性(除非你需要相同的square
才能有不同的不同背景下的名字。)
同时,此方向的映射无法用于查找squares_dict[response]
,因为response
是名称,而不是square
。因此,您肯定需要在相反方向上进行映射,无论是作为此对象的补充还是替代。
如果你废弃了square-to-name映射并且只保留了name-to-square映射,你仍然可以迭代正方形;您只需for square in squares_dict.values():
而不只是for square in squares_dict:
。
答案 1 :(得分:3)
第一个问题:您的词典似乎是倒退的:您想要从他们的位置查找square
个对象,而不是相反。这就是为什么你的第一个条件永远不会成立。您也可以strip()
response
来确保您没有任何隐藏的空格。
square_dict = {"a1":a1, "a2":a2, "b1":b1, "b2":b2}
# Later...
response = raw_input("where would you like to move?").strip()
# Later still...
for a in square_dict.values(): # Because we switched the dictionary around!
如果您不想以静默方式剥离空白,我建议您至少在他们的字典中找不到的情况下回复他们的输入(print('"{}"'.format(response))
),这样他们就会(你)可以确定至少输入是正确的。
第二个问题是因为您定义residence
的方式。您将变量设置为bool
,这根本不是您想要的。第五行应该是:
self.residence = residence
最后,还有一些关于你的代码的想法!您可以通过查看True
来检查值是否为if a.residence == True:
。此比较的preferred form是更简单的版本:
if a.residence:
您的方法也可以更具描述性地命名。一般来说,使用动词开始函数或方法名称总是很好的,以提高可读性。这当然是一个风格问题,但是,例如,我们看到的两个函数movement_select
和movement
对于它们的功能并不十分清楚。如果他们使用标准化形式,例如,它将更容易阅读。 choose_move
和perform_move
。
答案 2 :(得分:2)
self.residence = bool
应该是
self.residence = residence
答案 3 :(得分:1)
你没有设置住所,这是错误的:
class square(object):
def __init__(self,updown,leftright,residence,name):
self.updown = updown
self.leftright = leftright
self.residence = bool
self.name = name
必须是
class square(object):
def __init__(self,updown,leftright,residence,name):
self.updown = updown
self.leftright = leftright
self.residence = residence # not bool!!
self.name = name
答案 4 :(得分:-2)
您的回复包含 \ n 符号,只需 strip()即可 您还应该在词典中的键和值之间交换位置