如何在Python中将变量初始化为None/未定义并与其他变量比较?

13 投票
6 回答
97987 浏览
提问于 2025-04-15 11:18

基本上,我有一些变量,我不想提前初始化它们:

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

我同意他的警告,这种设计不好。

撰写回答