如何在Python中将变量初始化为None/未定义并与其他变量比较?
基本上,我有一些变量,我不想提前初始化它们:
originalTime = None
recentTime = None
postTime = None
def DoSomething ( ) :
if originalTime == None or (postTime - recentTime).seconds > 5 :
...
在这个if语句上我遇到了编译错误:
UnboundLocalError: local variable 'originalTime' referenced before assignment
如你所见,所有这些变量之间的关系都不同,有的需要设置为正确的值(比如时间、时间加5等等),或者完全不设置(即None),但我觉得在声明它们为None的时候,直接给它们预先计算的值要简单得多。
有没有什么好的想法?
6 个回答
1
如果if
语句是在一个函数里面,而= None
的声明是在模块级别,也就是说在函数外面,那么这些变量在函数内部是无法使用的。最简单的解决办法就是明确告诉程序,这些变量是在全局范围内的:
def doSomething():
global originalTime
if originalTime:
print "originalTime exists and does not evaluate to False"
顺便说一下,很多人认为这样设计Python并不好。如果你也这么认为,并且你的程序结构允许的话,你可以考虑重构你的函数,让它通过函数参数来接收外部的依赖。
6
你的代码应该是可以运行的,我猜它是在一个函数里面,但originalTime
这个变量是在别的地方定义的。还有,如果你真的想检查originalTime
是否为空,最好用originalTime is None
,或者更简单一点,直接用not originalTime
。
24
我需要纠正一下Jarret Hardie,因为我没有足够的声望来评论。
全局作用域并不是问题。Python会自动在外层作用域中查找变量名。唯一的问题是当你想要改变变量的值时。如果你只是重新定义这个变量,Python会创建一个新的局部变量,除非你使用global这个关键词。所以
originalTime = None
def doSomething():
if originalTime:
print "originalTime is not None and does not evaluate to False"
else:
print "originalTime is None or evaluates to False"
def doSomethingElse():
originalTime = True
def doSomethingCompletelyDifferent()
global originalTime
originalTime = True
doSomething()
doSomethingElse()
doSomething()
doSomethingCompletelyDifferent()
doSomething()
应该输出:
originalTime is None or evaluates to False
originalTime is None or evaluates to False
originalTime is not None and does not evaluate to False
我同意他的警告,这种设计不好。