Python名称未定义,但计算结果为true。怎么用?

Python名称未定义,但计算结果为true。怎么用?,python,Python,我有一些类似这样的python代码: try: bob = bob_module.Bob('alpha') except Exception as e: print 'Alpha mode failed for bob: ' + str(e) + ').' try: if bob: bob.add('Beta') else: bob = bob_module.Bob('Beta') except Exception as e:

我有一些类似这样的python代码:

try:
    bob = bob_module.Bob('alpha')
except Exception as e:
    print 'Alpha mode failed for bob: '  + str(e) + ').'

try:
    if bob:
        bob.add('Beta')
    else:
        bob = bob_module.Bob('Beta')
except Exception as e:
    print 'Beta mode failed for bob: ' + str(e) + ').'
当此代码运行Alpha模式失败时,出于可以理解的原因(与Alpha服务器的交互失败)。但是,测试模式失败,原因是“未定义名称‘bob’”

当然,如果没有定义name
bob
,那么
如果bob
等于false,我们进入
else
子句,运行
bob
构造函数,将结果分配给变量
bob

我现在无法调试它,因为导致Alpha模式失败的错误是暂时的,现在已经消失了,但我想理解这一点有两个原因:智力上的好奇心,以及在Alpha模式再次失败时使代码健壮

当然,如果没有定义名称bob,那么如果bob等于false

否。如果未定义
bob
,则尝试使用它是一个错误

bob=None
放在文件顶部,以确保在所有代码路径中都定义了它。

执行此操作时:

bob = bob_module.Bob('alpha')
Python将不会到达分配阶段(分配失败函数调用的返回)-它将直接跳到异常捕获阶段

由于bob仍然未定义,因此当您稍后在语句中尝试使用它时:

if bob:
Python不知道什么是
bob
,更不用说它的计算结果是
True
还是
False
,所以它会弹出另一个错误

如果您想要预定义
bob
,而不管第一个函数的执行结果如何,只需在函数调用之前将
None
分配给它,这样Python就知道
bob
None
,从而可以在If语句中正确地计算它,不管之前发生了什么

更新-如果您确实不想事先定义您的
bob
,您仍然可以使用以下方法检查它的存在:

if "bob" in globals():  # replace globals() with locals() for the current scope
或者检查它是否同时存在并计算为
True

if globals().get("bob", None):  # replace globals() with locals() for the current scope

“当然,如果没有定义bob这个名字,那么如果bob等同于false”嗯,不,这就像说“如果外星人不存在,他们肯定是绿色的”。这没有任何意义。如果它不存在,该如何计算呢?
名称bob未定义
表示如果bob失败,则执行
,而不是执行
否则
。未定义与作为
None
False
不同,因为
bob=bob
引发异常bob未设置。查看是否应该检查bob不是无:@rawing,什么?你的类比有什么相似之处?我的意思是,如果名称“bob”不存在,即如果变量不存在或尚未创建/填充,那么测试它应该返回false。这更像是说,如果外星人不存在,那么他们根本就没有颜色。谢谢,斯玛克斯。我给了zwer一个更完整的答案,但还是投了你一票。