如何在Python中找到未声明的变量?

时间:2012-05-08 01:18:33

标签: python variables

最近我一直在制作游戏,但我遇到了问题。要计算你对敌人的击中,它使用变量

此时玩家可能购买或未购买过剑,因此我收到一条错误消息:“未声明变量”。有没有办法解决尚未声明的变量?

5 个答案:

答案 0 :(得分:8)

您有两种选择。

首先要确保玩家总是拥有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块中包含对sword变量的每个引用,并吞下可能引发的NameError:

 try:
    if sword == 10:
        print 'Choppity chop chop chop.'
 except NameError:
    pass

第一种解决方案(更好)。

答案 1 :(得分:1)

在没有看到更多代码的情况下,我会说通常的方法是“原谅尚未声明的变量”将通过处理NameError异常的可能性。

try: 
  # variable sword may or may not exist here..
  sword
except NameError:
  # handle this

答案 2 :(得分:1)

有几种选择。 wim提供的很好但是如果你的变量实际上是dict中的一个键,那么你可以像这样缩短它:

has_sword = my_items.get('sword', False)

get()方法中的第二个值是剑键不存在时的默认值。

PRO TIP: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!"

答案 3 :(得分:1)

我不确定你游戏的全部范围。 “剑”是玩家角色可以携带的唯一项目,还是他们的开放式隐含库存? (例如,玩家角色有麻袋或背包,可以在游戏过程中拾取物品。)

如果你想给角色一个盘点,你可以使用一个简单的列表,或者,如果所有项目都是唯一的 - 即角色一次只能拥有一把剑,那么一套就适合。

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!"

答案 4 :(得分:0)

您可以检查变量是否存在于globals或locals dict中,或使用:

try:
    a = b
except NameError:
    a = b = 1