如何将变量初始化为None / Undefined并与Python中的其他变量进行比较?

时间:2009-04-28 23:22:38

标签: python

基本上我有一些我不想预先初始化的变量:

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等),要么根本不设置,但我不想在声明它们时将它们设置为预先计算的值无更容易。

有什么想法吗?

6 个答案:

答案 0 :(得分:14)

我需要纠正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

我再次警告这是一个糟糕的设计。

答案 1 :(得分:6)

你的代码应该有效,我猜它是在一个函数里面,但是originalTime是在别的地方定义的。 如果这是你真正想要的,甚至更好的originalTime is None,那么说not originalTime也好一点。

答案 2 :(得分:0)

如果if语句在函数内部,但= None声明在模块级别,则变量超出函数范围。最简单的解决方法是明确指出变量标识符可以在全局范围内找到:

def doSomething():
    global originalTime
    if originalTime:
        print "originalTime exists and does not evaluate to False"
很多人认为这是糟糕的Python设计,顺便说一句。如果您同意该评估,并且您的体系结构允许,您可能希望重构您的函数,以便它接收外部依赖项作为函数参数。

答案 3 :(得分:0)

==>如果初始值为无

>>>toto = None

>>>toto = toto if toto is not None else "default Value"

>>>toto

'default value'

==>如果变量不存在

>>>del toto

>>>toto = toto if locals().get('toto') else "default Value"

>>> toto

'default value'

==>设置值时的相同命令

>>>toto = 1

>>>toto

1

>>>toto = toto if locals().get('toto') else "default Value"

1

答案 4 :(得分:-2)

我刚尝试了shell中的代码,但没有收到错误。它应该工作。也许发布整个代码? 您也可以使用try / catch。

或者也许是locals()。has_key('originalTime')?

答案 5 :(得分:-2)

这并没有任何“漂亮”的方式。只是基于你给出的变量名,我的第一直觉就是创建一个对象:

class SomeTimeClass(object):
    def __init__(self, recentTime=None, originalTime=None, postTime=None):
        self.recentTime = recentTime
        self.originalTime = originalTime
        self.postTime = postTime

time = SomeTimeClass()
if not time.recentTime::
    ...

这可能有效,因为它听起来像变量是相关的。其他几个选择:

将程序包裹在一个函数中:

def SomeFunc(recentTime=None, originalTime=None, postTime=None):
    if not recentTime:
        ... 

使用dict:

some_dict = {}

if not some_dict.get('originalTime', None): #return None if key doesn't exist
    ...