最近我一直在创建一个游戏,但我遇到了一个问题。要计算你对敌人的打击,它使用变量Sword。
此时玩家可能购买了也可能没有购买剑,因此我收到一条错误消息:“未声明变量”。有没有办法解决尚未声明的变量?
你有两个选择。
首先是确保玩家总是有一个sword
变量。设置为None
在玩家获得剑之前,当你需要知道玩家是否有剑时,检查变量是否为None
:
sword = None
# do lots of stuff here
if sword is None:
print 'Hey, no sword!'
else:
print 'Chop, chop, chop!'
如果剑不允许为空字符串或整数值 0,则另一种写法是:
if sword:
print 'Chop, chop, chop.'
您的第二个选择是将每个对剑变量的引用包装在 try 块中并吞下可能引发的 NameError :
try:
if sword == 10:
print 'Choppity chop chop chop.'
except NameError:
pass
第一个解决方案(好得多)。
在没有看到更多代码的情况下,我会说“原谅尚未声明的变量”的常用方法是处理NameError
异常的可能性。
try:
# variable sword may or may not exist here..
sword
except NameError:
# handle this
有几种选择。wim 提供的很好,但是如果您的变量实际上是 dict 中的键,那么您可以像这样缩短它:
has_sword = my_items.get('sword', False)
该get()
方法中的第二个值是剑键不存在时的默认值。
专业提示: globals() 和 locals() 分别提供对在全局范围和函数中声明的变量的直接访问。这意味着globals().get('sword', False)
应该对您全局声明的变量有效。
最后,正如 wim 所建议的那样,您并没有真正以正确的方式解决这个问题。一种更 Pythonic 的方法是使用这样的类:
class Player():
def __init__(self)
self.sword = None
player = Player()
if player.sword:
print "Off with his head!"
我不确定你的游戏的全部范围。“剑”是玩家角色可以携带的唯一物品,还是它们是开放式的隐含物品栏?(例如,玩家角色有一个麻袋或背包,并且可以在游戏过程中捡起物品。)
如果你想给角色一个物品栏,你可以使用一个简单的列表,或者,如果所有的物品都是独一无二的——即角色一次只能有一把剑,那么一套是合适的。
class Player(object):
def __init__(self):
self.inventory = set( )
@property
def has_sword(self):
return ('sword' in self.inventory)
me = Player( )
me.inventory.add('sword')
if me.has_sword:
print "swish!"
您可以检查变量是否存在于全局或本地字典中,或使用:
try:
a = b
except NameError:
a = b = 1